logging - 为什么不在最低级别调试时记录信息级别消息?

  显示原文与译文双语对照的内容

我在 C# 应用程序中使用Nlog的代码如下。 '调试'的消息被记录,但'信息'没有。 我假设,由于minLevel在,中设置为'调试',因这里'信息'消息也会被记录,因为Debug比'信息'更高优先级。 但他们没有记录。 我 哪里 错 了?

谢谢。


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>

时间: 原作者:

这与 @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); 

我觉得这不是真正的true 。 使用原始代码,只有调试消息或者信息消息才会被记录。 如果删除嵌套,那么根据所启用的日志记录级别,可以获取记录的两条消息。

我认为你应该用这种方式记录:


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

日志方法( logger.debug, logger.Info, 等) 已经执行IsXXXEnabled检查,如果没有启用日志记录级别,则不会记录日志。 你可以通过直接进行日志调用而不是保护( 和困惑) 来保存输入的日志。

有时,你希望使用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);

在这两种情况下,除非启用调试级别,否则将不计算正在传递给is的表达式。

原作者:

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

如果你想将消息记录在调试和信息级别上,我建议你将嵌套的if语句拆分成 2个。

...