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

Posted

技术标签:

【中文标题】如何强制重新加载 NLog 配置文件?【英文标题】:How to force reload of NLog configuration file? 【发布时间】:2016-10-07 20:08:12 【问题描述】:

我将 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 上),在配置文件中定义的简单“文件”目标,minLevel = Trace 和 autoReload=True

在类级别实例化的记录器: 私有静态只读 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 配置管理中的错误,请告诉我。

【问题讨论】:

这是正确的使用方法。检查内部日志,它会告诉重新加载时发生了什么。 你好。很高兴知道。明天我将启用具有最大详细信息的 Nlog 内部日志,并随时通知您。谢谢 你好@朱利安。我已经在上面发布了我所做的测试,但仍然存在问题。你能检查一下吗?非常感谢您,如果我认为您是 NLog 的主要作者之一,多年来我在几乎所有项目中都非常高兴地使用它。 约翰尼·斯瓦罗格给出了答复。没有注意到这么简单的事情,我觉得有点愚蠢:) 【参考方案1】:

实际上,您的代码中有一个错误: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() 是一个纯粹的方法,只是返回定义的设置,我认为它的目的是重新加载和应用配置。 嗨,是的,似乎它确实应该以这种方式工作,但实际上并没有......如果我是 NLog 团队的开发人员,我会将此方法重命名为“加载”= ) 那么这个:NLog.LogManager.Configuration = new NLog.Config.XmlLoggingConfiguration(NLogConfigFile_Dst, true); NLog.LogManager.ReconfigExistingLoggers();应该做同样的事情......从文件中加载配置,然后重新配置记录器 - 对吧?

以上是关于如何强制重新加载 NLog 配置文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何强制 NLog 覆盖日志文件

以编程方式重新配置 NLog LoggingConfiguration 过滤器

Vue页面重新加载刷新数据配置

如何强制重新加载缓存的 HTML 文件

NLog 忽略配置文件

如何强制浏览器重新加载缓存的 CSS 和 JavaScript 文件