NLog: как программно получить уровень конкретной цели

#c# #nlog

#c# #nlog

Вопрос:

В настоящее время я использую NLog и разрешаю пользователям-администраторам устанавливать уровень во время выполнения, используя переменную следующим образом:

 <logger name="*" minLevel="${var:myFileLevel}" writeTo="file" />
 

Я хотел бы знать уровень этого регистратора во время выполнения (поэтому я не могу получить его из файла конфигурации из-за переменной)

Я могу легко получить цель следующим образом:

 Target target= LogManager.Configuration.FindTargetByName("file");
 

но, к сожалению, для целевого объекта нет соответствующих методов для получения уровня. Возможно ли получить уровень ведения журнала во время выполнения?

Комментарии:

1. Почему не проверять Logger.IsEnabled(logLevel) или определенные Logger.Is*Enabled свойства? Это позволяет вам быть уверенным в том, что настроено для любого данного регистратора.

2. @Dennis: я пробовал это, но это не удается, если у вас настроено несколько целей на разных уровнях. Принятое решение — это именно то, что мне нужно.

Ответ №1:

Включенный уровень ведения журнала настраивается в правиле ведения журнала.

Итак, вы могли бы сделать это:

  1. Добавьте имя правила, чтобы вам было проще найти правило:
     <logger name="*" minLevel="${var:myFileLevel}" writeTo="file" ruleName="myrule" />
     
  2. Найдите правило и проверьте Levels свойство. См. LoggingConfiguration .Метод FindRuleByName
     var rule = LogManager.Configuration.FindRuleByName("myrule");
    var levels = rule.Levels;  // enabled levels
     

В этом случае другим вариантом является чтение значения переменной myFileLevel . Для этого вам нужно его отобразить, вы могли бы использовать LogEventInfo.CreateNullEvent() для этого.

 var myFileLevelLayout = LoggingConfiguration.Variables["myFileLevel"]; // Type SimpleLayout
string value = myFileLevelLayout.Render(LogEventInfo.CreateNullEvent())
 

См.
LoggingConfiguration .Свойство переменных