如何强制重新加载NLog配置文件?

8

我正在使用带有配置文件的NLog。为了避免为某些长时间处理记录太多东西,我正在做这样的事情:

 foreach (LoggingRule rule in LogManager.Configuration.LoggingRules) 
 {
      rule.DisableLoggingForLevel(LogLevel.Trace);   
      rule.DisableLoggingForLevel(LogLevel.Debug);   
 }
 LogManager.ReconfigExistingLoggers();

它允许我临时降低日志记录详细级别。上面的行只是为了说明而已。

之后,我想通过重新加载已在程序启动时自动加载的NLog.Config文件来恢复我的“常规”日志记录配置。

LogManager.Configuration.Reload();
LogManager.ReconfigExistingLoggers();

我认为这很简单,但configuration.Reload并没有达到我的期望,我也没有找到其他合适的方法。在调用之后,我的记录器仍然没有存储跟踪和调试事件,而它们在程序启动时是存在的。
所以我的问题是:如何在运行时以编程方式强制重新加载NLog.config,并恢复我的“标准”记录器设置?
谢谢
更多详细信息更新的问题:
我正在使用VS2013,.Net 4项目,使用NLog 4.4.0-beta11(nuget上的最新beta版),配置文件中定义了简单的“File”目标,minLevel = Trace,autoReload=True Logger在类级别被实例化:         private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
以下是我的测试证据:
    Assert.True(Logger.IsTraceEnabled);
    Assert.True(Logger.IsDebugEnabled);

    Logger.Trace("1 - This should appear in log");
    Logger.Debug("2 - This should appear in log");

    foreach (LoggingRule rule in LogManager.Configuration.LoggingRules)
    {
        rule.DisableLoggingForLevel(LogLevel.Trace);
        rule.DisableLoggingForLevel(LogLevel.Debug);
    }
    LogManager.ReconfigExistingLoggers();

    Logger.Trace("3 - This should NOT appear in log");
    Logger.Debug("4 - This should NOT appear in log");
    Logger.Info("5 - This should appear in log");

    Assert.False(Logger.IsDebugEnabled);
    Assert.False(Logger.IsTraceEnabled);

    LogManager.Configuration.Reload();
    LogManager.ReconfigExistingLoggers();

    // This is were something goes wrong

    Logger.Trace("6 - This should appear in log"); // DOES NOTHING
    Logger.Debug("7 - This should appear in log"); // DOES NOTHING
    Logger.Info("8 - This should appear in log");

    Assert.True(Logger.IsDebugEnabled); // FAILS
    Assert.True(Logger.IsTraceEnabled); // FAILS

生成的日志:

    TRACE 1 - This should appear in log         
    DEBUG 2 - This should appear in log
    INFO 5 - This should appear in log
    INFO 8 - This should appear in log

在nlog的内部日志中,我可以看到配置似乎已经被重新加载,没有问题(文件很长,所以我不会在这里发布,除非有人要求),但现有的记录器可能没有更新?
使用上面的代码应该很容易在您的一侧尝试。如果我做错了什么或者这是NLog配置管理中的一个错误,请告诉我。

1
这是正确的使用方式。检查内部日志,它会告诉你在重新加载时发生了什么。 - Julian
你好。很高兴知道这个消息。明天我将启用Nlog内部日志,并保持您的通知。谢谢。 - AFract
你好@Julian。我已经在上面发布了我所做的测试,但仍然存在问题。你能否帮忙检查一下?非常感谢!如果我没记错的话,你是NLog的主要作者之一,我已经使用它多年,非常喜欢。 - AFract
Johnny Svarog回答了。我感到有点愚蠢,没有注意到一个如此简单的事情 :) - AFract
1个回答

9

实际上,您的代码存在错误:LogManager.Configuration.Reload() 不会更改日志记录器的配置,而是从 NLog.config 文件中加载配置,反序列化并返回 LoggingConfiguration 作为结果。

要恢复配置,您需要执行类似以下操作:

LogManager.Configuration = LogManager.Configuration.Reload();
LogManager.ReconfigExistingLoggers();

以下是一个测试示例(示例配置中的minLevel =“DEBUG”):

[TestMethod]
        public void Test()
        {
            Logger.Trace("TRACE 1");
            Logger.Debug("DEBUG 1");
            Logger.Warn("WARN 1");

            foreach (LoggingRule rule in LogManager.Configuration.LoggingRules)
            {
                rule.DisableLoggingForLevel(LogLevel.Trace);
                rule.DisableLoggingForLevel(LogLevel.Debug);
            }
            LogManager.ReconfigExistingLoggers();

            Logger.Trace("TRACE 2");
            Logger.Debug("DEBUG 2");
            Logger.Warn("WARN 2");

            // Reconfigure();
            LogManager.Configuration = LogManager.Configuration.Reload();
            LogManager.ReconfigExistingLoggers();

            Logger.Trace("TRACE 3");
            Logger.Debug("DEBUG 3");
            Logger.Warn("WARN 3");
        }

输出:

(DEBUG): DEBUG 1
(WARN): WARN 1
// here settings changed
(WARN): WARN 2
//here settings reloaded
(DEBUG): DEBUG 3
(WARN): WARN 3

你好,你说得完全正确,我已经做出了更改,现在没问题了。抱歉,我没有注意到 Configuration.Reload() 是一个纯方法,只返回定义的设置,我以为它的目的是重新加载和应用配置。 - AFract
2
嗨,是的,看起来它确实应该这样工作,但实际上并不是这样... 如果我是NLog团队的开发人员,我会将这个方法重命名为“Load”=) - Johnny Svarog
2
然后这个:NLog.LogManager.Configuration = new NLog.Config.XmlLoggingConfiguration(NLogConfigFile_Dst, true); NLog.LogManager.ReconfigExistingLoggers();应该做同样的事情...从文件加载配置,然后重新配置记录器 - 对吗? - MrLister

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