2016-06-07 80 views
3

我正在使用NLog和配置文件。 为了避免登录太多的东西了一些长期的治疗,我做这样的事情:如何强制重新载入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在类级别实例化: 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 

在n日志内部日志,我可以看到的配置似乎已经重新装入没问题(很长的文件,所以我除非有人询问,否则不要在这里发布),但也许现有的记录器不会更新?

上面的代码应该很容易在你身边试试。请让我知道如果我做错了什么或者它是否是NLog配置管理中的错误。

+1

这是使用它的正确方法。检查内部日志,它会告诉重新加载时发生的情况。 – Julian

+0

你好。很高兴知道。明天,我将启用Nlog内部日志,并提供详细信息并随时通知您。谢谢 – AFract

+0

你好@朱连。我已经在上面发布了完全正确的测试,但仍然存在问题。你可以检查一下吗?非常感谢你,如果我认为你是NLog的主要作者之一,我很高兴几年以来对我的所有项目都非常满意。 – AFract

回答

3

实际上,您的代码中存在错误: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 
+0

你好,你是完全正确的,我做了改变,现在没事了。对不起,我没有注意到Configuration.Reload()是一个纯粹的方法,只是返回定义的设置,我认为它的目的是重新加载和应用配置。 – AFract

+2

嗨,是的,看起来好像它应该以这种方式工作,但实际上它不......我将这个方法重命名为'加载',如果我是来自NLog团队的开发人员=) –

+1

的确,名字是错误。或者行为;) – Julian