2010-01-10 2 views
1

Есть список Контекстная информация (т.е. $ {longdate}, $ {level}, $ {message}) онлайн? Я хочу установить файл журнала в папке AppData \ Local пользователя. Может быть, $ {appdatalocal}? И как я могу получить доступ к файлу для отправки в виде прикрепленного письма, например,
message.Attachments.Add("${appdatalocal}\somefolder\Application.log")?Контекстная информация в файлах app.config

+0

Хм, мне немного не ясно, как это относится к файлу 'app.config'; может быть, вы могли бы разработать или перефразировать? Вы говорите, что хотите использовать переменную среды в 'app.config'? Возможно, я просто не понимаю вопроса. Если вы хотите получить доступ к значениям из вашего 'app.config', тогда используйте' ConfigurationManager.AppSettings', но я не уверен, что это то, что вы хотите. –

ответ

2

См. Этот link для списка LayoutRenderers, поддерживаемого NLog. Обратите внимание, что некоторые из этих рендерингов макетов добавлены в NLog 2.0 (который был выпущен только как бета-версия в сентябре). Есть несколько LayoutRenderers, которые позволяют вам указывать «специальные» папки (например, «Мои документы», «Моя музыка» и т. Д.). Существует также LayoutRenderer, который может извлекать значение переменной среды. Вы можете использовать LayoutRenderers, чтобы определить имя файла:

${basedir}/${shortdate}.log 

или

${environment:variable=TEMP}/${processname}.log 

Насколько доступ получившийся файла программно, я не знаю, как сделать это, хотя у меня есть идея. ..

Вы можете настроить MethodCallTarget (см. Документацию по ссылке выше - или, что еще лучше, увидеть файл справки NLog) с тем же макетом, что и макет, который вы используете для определения имени файла. Определите одно правило регистрации в файле NLog.config (или app.config, если вы настроите inline), который ведет журнал на эту цель. Напишите статический метод LogMethod, который вызывается MethodCallTarget. Напишите другой статический метод GetFilename в том же классе, который возвращает строку. GetFilename просто регистрирует сообщение, используя журнал, который настроен для записи в MethodCallTarget. NLog вызывает LogMethod. Внутри LogMethod вы получите полностью отформатированное сообщение. Поскольку вы настроили макет так же, как макет имени файла (т. Е. Только параметры, необходимые для вычисления имени файла), значение сообщения, которое регистрируется, должно быть путем к файлу. Поскольку LogMethod должен быть статическим (требование NLog), у вас нет большого выбора, где хранится «имя файла». Я просто поставил статическую строковую переменную.

Нечто подобное (на основе образцов в файле NLog помощи при MethodCallTarget):

public class Example 
{ 
    private static filename; 

    // 
    // This is the method that NLog will call when you log with the logger that is configured 
    // to write to the MethodCallTarget 
    // 
    public static void LogMethod(string level, string message) 
    { 
    filename = message; 
    } 

    public static string GetLogFile() 
    { 
    Logger logger = LogManager.GetLogger("filenamelogger"); 
    filenamelogger.Info("logging a message just to get the result"); 
    return filename; 
    } 
} 

Настройка что-то вроде этого:

<variable fn="${basedir}/${processname}.log" /> 
    <targets> 
    <target name="m" xsi:type="MethodCall" className="Example, MethodCall" 
      methodName="LogMethod"> 
     <parameter layout=${fn} /> 
    </target> 
    <target name="f" xsi:type="File" 
      layout="${longdate} ${loggername} ${level} ${message}" 
      fileName="${fn}"> 
    </target> 
    </targets> 
    <rules> 
    <logger name="filenamelogger" minlevel="Debug" writeTo="m" final="true" /> 
    <logger name="*" minlevel="Debug" writeTo="f" /> 
    </rules> 

Очевидно, что это не поточно, но это шоу способ получить результат макета.