我正在将 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();
我认为这很容易,但配置。重新加载并没有达到我的预期,而且我没有找到任何其他合适的方法。
调用后,我的记录器在程序启动时仍然不存储跟踪和调试事件。
所以我的问题是:如何以编程方式强制在运行时重新加载 NLog.config 并恢复我的“标准”记录器设置?
Thanks
问题更新并提供更多详细信息:
我正在使用 VS2013、.Net 4 projet 和 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 配置管理中的错误,请告诉我。