Использование NLog для вывода в один из двух файлов журнала - PullRequest
2 голосов
/ 12 мая 2019

У меня однопоточное приложение .NET Winforms. Я использую статический регистратор NLog для регистрации ошибок, используя этот синтаксис:

MyLogger.Log.Error("Error occurred...");

В соответствии с моей единственной целью, определенной NLog.config, и одним правилом, определенным NLog.config, этот вывод ошибок журнала всегда записывается в файл с именем "errors.txt". Иногда я хочу, чтобы ошибка была записана в "errors2.txt". Как бы я сделал это без создания другого экземпляра статического регистратора?

1 Ответ

1 голос
/ 12 мая 2019

Вы можете использовать фильтры в конфигурации или передать имя файла в вызов логгера.

Примечание. В этих примерах используется .WithProperty (для NLog Logger), представленный в NLog 4.6.3

Фильтры

Использование фильтров в правилах ведения журнала.мы используем LogFinal, поэтому нам нужны только правила один раз (не требуется для второго правила ведения журнала)

См. Фильтрация сообщений журнала в вики NLog

<rules>
  <logger name="*" writeTo="file-error1">
    <filters defaultAction='LogFinal'>
      <when condition="${event-properties:target} == 'error2'" action="Ignore" />
    </filters>
  </logger> 
  <logger name="*" writeTo="file-error2">
  </logger> 
</rules>

Loggercall:

MyLogger.Log.Error("Error occurred..."); // writes to file-error1 target
MyLogger.Log.WithProperty("target", "error2").Error("Error occurred..."); // writes to file-error2 target

Передать имя файла

Передать имя файла в качестве свойства.Возможно, вы могли бы установить свойство по умолчанию в статическом методе Log.

См. Также Документация по свойствам событий

<targets>
    <target name="file" xsi:type="File"
        ....
        fileName="${basedir}/logs/{event-properties:filename}" 
        ...  />
</targets>

Вызов Logger:

MyLogger.Log.WithProperty("filename", "error1.txt").Error("Error occurred...");
MyLogger.Log.WithProperty("filename", "error2.txt").Error("Error occurred...");
...