Использование NLog GetLogger для возврата к стандартному логгеру - PullRequest
0 голосов
/ 09 мая 2019

Я, вероятно, здесь упускаю важный момент, но я понимаю, что регистраторы определены в NLog.config, а цели также определены в NLog.config.

Я использую регистратор с именем "*" в качестве регистратора. Поэтому, когда я хочу записать ошибку, я делаю что-то вроде этого:

Logger.Log.Error("Oops.");

Этот код записывает в цель, которую мой регистратор указывает для использования на уровне «Ошибка». Он записывает в файл с именем «Error.log». Хорошо.

Для любого моего кода, который влияет на пользовательский интерфейс (этот код распространяется на несколько классов), я иногда хочу войти в файл UI.txt. Итак, я создал регистратор с именем «UI», и он указывает значение writeTo, которое соответствует определенной цели. Хорошо.

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

NLog.LogManager.GetLogger("UI");

Затем, когда я использую эту команду, она записывает в цель пользовательского интерфейса (файл с именем UI.log):

Logger.Log.Error("Oops.");

У меня вопрос: как вернуть регистратору его прежнее значение, чтобы в следующий раз, когда я использую метод Logger.Log.Error, он записывал в Error.log, а не в UI.log? Я ожидаю, что мне нужно будет использовать другую строку, как это, но я не знаю, что поставить вместо ???:

NLog.LogManager.GetLogger("???");

Я ознакомился с документацией и не увидел ничего, что помогло бы мне понять, какой аргумент передать GetLogger, чтобы переключиться обратно на регистратор по умолчанию. Даже если передача «*» работает, она может сделать больше, чем мне нужно / нужно. Есть ли способ получить регистратор «по умолчанию», который действует до того, как вы вызовете метод GetLogger ()?

Ответы [ 2 ]

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

Я, вероятно, здесь упускаю важный момент, но я понимаю, что логгеры определены в NLog.config и что цели также определены в NLog.config.

Это не такполностью правильно.В NLog.config определены цели и правила, а не логгеры.

Вероятно, у вас будет что-то вроде этого:

<rules>
    <logger name="*" writeTo="myTarget" />
</rules>

Что означает, определите правило, которое сопоставляет логгер с соответствием имениподстановочный знак *.

Мой вопрос: как вернуть регистратору прежнее значение

Или сохранить экземпляр Logger, или, возможно, использовать LogManager.GetCurrentClassLogger()?Также обратите внимание, что Logger имеет свойство Name.

Также обратите внимание, что «put back» не звучит поточно-ориентированно.Если вам нужна безопасность потоков, рекомендуется использовать отдельные экземпляры регистратора (как это было предложено Антониосом Катоподисом).

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

Я бы настоятельно рекомендовал создать 2 статических класса UILog и DefaultLogger, где вы просто будете называть их UILog.Log("your_message"), и класс журнала будет выглядеть так:

private static Logger logger = LogManager.GetLogger("your_logger");

public static  void Log(string message){
    Logger.Log.Error(message);
}

Я думаю, что это хорошая практика - иметь регистраторы с именами и создавать классы для каждого из этих регистраторов с помощью соответствующих методов.

...