我在使用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>
答案 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个单独的语句。