1

我在使用 Nlog 的 C# 应用程序中有以下代码。带有“调试”的消息会被记录,但“信息”不会。我假设由于 app.config 中的 minLevel 设置为“Debug”,“I​​nfo”消息也会被记录,因为 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>

4

2 回答 2

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 的表达式。

于 2010-11-30T16:38:18.637 回答
2

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

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

于 2010-11-30T11:13:41.420 回答