如何在运行时增加NLog日志级别

5

我的应用程序在程序开始时有太多的log.Trace(),导致程序出现故障,因此我无法使用通用的NLog配置来增加日志级别。

因此,我想在运行时增加日志级别。为此,我在互联网上找到了类似于以下内容的东西:

foreach (var rule in LogManager.Configuration.LoggingRules)
{
    // Iterate over all levels up to and including the target, (re)enabling them.
    for (int i = 0; i <= 5; i++)
    {
        rule.EnableLoggingForLevel(LogLevel.FromOrdinal(i));
    }
}

然而,这似乎并没有起作用,因为以下行未显示在日志中,尽管我确定已经传递了此行:

log.Trace("log trace works!");

有人知道如何确保在我的源代码的某个时刻,我可以看到log.Trace()的结果吗?

供您参考:

  1. log被定义为private static readonly Logger log = LogManager.GetCurrentClassLogger();
  2. 我一直在寻找一个包含<nlog>标记的nlog.*文件,但我没有找到任何东西。

编辑:
我正在使用NLog版本4.5.4。

编辑2(尝试强制读取配置):
我已修改nlog.config文件如下:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true">

    <variable name="myLevel" value="Trace" />
    <rules>
      <logger minLevel="${var:myLevel}" />
    </rules>
    ...

然后我尝试强制重新读取该配置,方法如下:

NLog.LogManager.Setup().LoadConfigurationFromFile("C:\\...\\NLog.config");

提前致谢


1
不必更新所有的LoggingRules,您可以考虑在Level-configuration中使用NLog Layout。请参见https://github.com/NLog/NLog/wiki/Filtering-log-messages#semi-dynamic-routing-rules - Rolf Kristensen
1个回答

7

在循环之后调用LogManager.ReconfigExistingLoggers()似乎对我有效。

配置

<logger name="*" minlevel="Info" writeTo="console" />

代码

logger.Trace("Trace 1");
logger.Info("Info 1");

foreach (var rule in LogManager.Configuration.LoggingRules)
{
    for (var i = 0; i <= 5; i++)
    {
        rule.EnableLoggingForLevel(LogLevel.FromOrdinal(i));
    }
}

LogManager.ReconfigExistingLoggers();

logger.Trace("Trace 2"); // This is now printed.
logger.Info("Info 2");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接