Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logging 为什么不';当最低级别为“调试”时,是否会记录信息级别消息?_Logging_Nlog - Fatal编程技术网

Logging 为什么不';当最低级别为“调试”时,是否会记录信息级别消息?

Logging 为什么不';当最低级别为“调试”时,是否会记录信息级别消息?,logging,nlog,Logging,Nlog,我在使用Nlog的C#应用程序中有以下代码。将记录带有“Debug”的消息,但不会记录带有“Info”的消息。我假设,由于app.config中的minLevel设置为'Debug',也会记录'Info'消息,因为Debug的优先级高于'Info'。但它们不会被记录。我错在哪里 谢谢 if (logger.IsDebugEnabled) logger.Debug(logMessage) else if (logger.IsInfoEnabled)log.Info(logMessage); 这是

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


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


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

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


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

这与@Nobby的回答并没有什么不同,因为他在如何设置级别方面是正确的。我要说的是,您不必在登录之前进行IFXXENABLED检查

这是您当前在登录呼叫站点问题中的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);

在这两种情况下,除非启用调试级别,否则将不会对传递给NLog的表达式求值。

这与@Nobby的回答其实并没有什么不同,因为他对如何计算级别的看法是正确的。我要说的是,您不必在登录之前进行IFXXENABLED检查

这是您当前在登录呼叫站点问题中的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);
在这两种情况下,除非启用调试级别,否则将不会计算传递给NLog的表达式