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

AFr*_*act 5 .net c# logging nlog

我正在使用NLog和配置文件。为了避免在长时间的治疗中记录太多的东西,我正在做这种事情:

 foreach (LoggingRule rule in LogManager.Configuration.LoggingRules) 
 {
      rule.DisableLoggingForLevel(LogLevel.Trace);   
      rule.DisableLoggingForLevel(LogLevel.Debug);   
 }
 LogManager.ReconfigExistingLoggers();
Run Code Online (Sandbox Code Playgroud)

它允许我暂时降低日志记录的详细程度。上面的几行仅是一个示例。这似乎完美地工作。

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

LogManager.Configuration.Reload();
LogManager.ReconfigExistingLoggers();
Run Code Online (Sandbox Code Playgroud)

我认为这很容易,但是配置。Reload并没有达到我的期望,也没有找到其他合适的方法。调用之后,在程序启动时,我的记录器仍然不存储跟踪和调试事件。

所以我的问题是:如何以编程方式在运行时强制重新加载NLog.config并恢复我的“标准”记录器设置?

谢谢

问题更详细的更新:

我使用的是VS2013,.Net 4 projet和NLog 4.4.0-beta11(测试版,但最后一次使用nuget),在配置文件中使用minLevel = Trace和autoReload = True定义了简单的“文件”目标

在类级别实例化的Logger:私有静态只读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
Run Code Online (Sandbox Code Playgroud)

生成的日志:

    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
Run Code Online (Sandbox Code Playgroud)

在nlog内部日志中,我可以看到配置似乎已被重新加载,没有问题(文件很长,因此除非有人询问,否则我不会在此处发布它),但是也许现有的记录器未更新?

有了上面的代码,您可以轻松尝试一下。如果我做错了什么或者是NLog配置管理中的错误,请告诉我。

Joh*_*rog 5

实际上,您的代码中有一个错误:LogManager.Configuration.Reload()不会更改记录器的配置,但是会从NLog.config文件中加载配置,对其进行反序列化并返回LoggingConfiguration作为结果。

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

LogManager.Configuration = LogManager.Configuration.Reload();
LogManager.ReconfigExistingLoggers();
Run Code Online (Sandbox Code Playgroud)

这是一个测试示例(示例config =“ DEBUG”中的minLevel):

[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");
        }
Run Code Online (Sandbox Code Playgroud)

输出:

(DEBUG): DEBUG 1
(WARN): WARN 1
// here settings changed
(WARN): WARN 2
//here settings reloaded
(DEBUG): DEBUG 3
(WARN): WARN 3
Run Code Online (Sandbox Code Playgroud)

  • 嗨,是的,似乎确实应该以这种方式工作,但实际上却不行。如果我是NLog团队的开发人员,则可以将此方法重命名为“ Load”。 (2认同)
  • 那么这个: NLog.LogManager.Configuration = new NLog.Config.XmlLoggingConfiguration(NLogConfigFile_Dst, true); NLog.LogManager.ReconfigExistingLoggers(); 应该做同样的事情...从文件加载配置,然后重新配置记录器 - 对吗? (2认同)