为什么在最低级别为Debug时不会记录信息级别消息?

时间:2010-11-30 10:24:29

标签: logging nlog

我在使用Nlog的C#应用​​程序中有以下代码。记录“Debug”的消息,但“Info”不记录。我假设因为minLevel在app.config中设置为'Debug',所以'Info'消息也会被记录,因为Debug比'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 个答案:

答案 0 :(得分:3)

这并不是一个与@Nobby不同的答案,因为他对于关卡如何是正确的。我会说你不必在登录前进行IfXXXXEnabled检查。

这是您在日志记录呼叫站点的问题中的C#代码中的当前内容:

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

@Nobby建议,这可以通过这样做变得更干净:

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中,您可以访问lambda语法,除非实际记录消息,否则将允许您推迟可能昂贵的操作:

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

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

在这两种情况下,除非启用了DEBUG级别,否则不会评估传递给NLog的表达式。

答案 1 :(得分:2)

您的问题在于示例中的嵌套if语句。根据您的配置文件启用调试和信息日志级别。然后评估第一个if语句并执行其块,因为条件为真。因此永远不会到达else块,并且永远不会记录您的Info消息。

如果您要将消息记录为Debug和Info级别,我建议您将嵌套的if语句拆分为2个单独的语句。