Почему сообщения уровня Info не регистрируются, когда минимальный уровень - Debug? - PullRequest
1 голос
/ 30 ноября 2010

У меня есть следующий код в моем приложении C # с использованием Nlog.Сообщения с «Отладкой» регистрируются, а «Информация» - нет.Я предполагал, что поскольку minLevel в app.config установлен на «Debug», сообщения «Info» также будут регистрироваться, так как отладка имеет более высокий приоритет, чем «Info».Но они не регистрируются.Где я не прав?

Спасибо.

if (logger.IsDebugEnabled) logger.Debug(logMessage) else if (logger.IsInfoEnabled)log.Info(logMessage);

Это настройка app.config

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<targets>
  <target name="file" xsi:type="File" fileName="E:/Logoutputs/Remissol-Nlog.txt" />
</targets>

<rules>
  <logger name="*" minlevel="Debug" writeTo="file" />
</rules>

Ответы [ 2 ]

3 голосов
/ 30 ноября 2010

Это не совсем другой ответ, чем @Nobby, потому что он прав насчет уровней. Я скажу, что вам не нужно делать проверку IfXXXXEnabled перед регистрацией.

Это то, что вы в настоящее время имеете в своем коде C # в своем вопросе для сайта регистрации вызовов:

if (logger.IsDebugEnabled) logger.Debug(logMessage) else if (logger.IsInfoEnabled)log.Info(logMessage); 

@ Нобби предполагает, что это можно сделать чище:

if (logger.IsDebugEnabled) logger.Debug(logMessage);
if (logger.IsInfoEnabled) logger.Info(logMessage); 

Я не думаю, что это действительно так. С вашим исходным кодом будут регистрироваться ТОЛЬКО сообщение отладки ИЛИ информационное сообщение. Если вы удалите вложение, то, в зависимости от включенного уровня ведения журнала, вы можете зарегистрировать ОБА сообщения.

Я думаю, что вы должны войти таким образом:

logger.Debug(logMessage);
logger.Info(logMessage); 

Методы ведения журнала (logger.Debug, logger.Info и т. Д.) Уже выполняют проверку IsXXXEnabled и не будут регистрировать, если этот уровень ведения журнала не включен. Вы можете сохранить журнал ввода (и путаницу), просто позвонив в журнал напрямую, а не защитив его проверкой if.

Бывают случаи, когда вы хотите использовать проверку IsXXXEnabled. Например, если у вас есть какая-то работа по вычислению значений, которые должны быть зарегистрированы, и вы хотите выполнять эти вычисления только при регистрации:

if (logger.IsDebugEnabled)
{
  int value1 = DoSomeExpensiveCalculation();
  int value2 = DoSomeOtherExpensiveCalculation();
  logger.DebugFormat("v1 = {0}, v2 = {1}", value1, value2);
}

Таким образом, вы не платите цену вычислений, если вы не собираетесь их регистрировать.

Наконец, в NLog 2.0 у вас есть доступ к лямбда-синтаксису, который позволит вам отложить потенциально дорогостоящие операции, если сообщение фактически не зарегистрировано:

logger.Debug(() => string.Format("v1 = {0}, v2 = {1}", DoSomeExpensiveCalculation(), DoSomeOtherExpensiveCalculation()));

logger.Debug(() => "message" + i + ", " + j + "," + k);

В обоих случаях выражение, передаваемое в NLog, не будет оцениваться, если не активирован уровень DEBUG.

2 голосов
/ 30 ноября 2010

Ваша проблема связана с вложенными операторами if в вашем примере. Уровни Debug и Info log включены в соответствии с вашим файлом конфигурации. Затем выполняется первый оператор if и выполняется его блок, потому что условие истинно. Поэтому блок else никогда не достигается, и ваше информационное сообщение никогда не регистрируется.

Я предлагаю разделить вложенные операторы if на 2 отдельных оператора, если вы хотите записать сообщение для уровней отладки и информации.

...