Logging 为什么不';当最低级别为“调试”时,是否会记录信息级别消息?
我在使用Nlog的C#应用程序中有以下代码。将记录带有“Debug”的消息,但不会记录带有“Info”的消息。我假设,由于app.config中的minLevel设置为'Debug',也会记录'Info'消息,因为Debug的优先级高于'Info'。但它们不会被记录。我错在哪里 谢谢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); 这是
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的表达式