Контекстная информация в файлах app.config - PullRequest
1 голос
/ 11 января 2010

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

1 Ответ

2 голосов
/ 28 октября 2010

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

${basedir}/${shortdate}.log

или

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

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

Вы можете настроить MethodCallTarget (см. Документацию по ссылке выше - или, что еще лучше, посмотреть файл справки NLog) с тем же макетом, что и макет, который вы используете для определения имени файла. Определите одно правило ведения журнала в файле NLog.config (или app.config, если вы настраиваете встроенный), которое регистрирует эту цель. Напишите статический метод 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> 

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

...