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配置管理中的错误,请告诉我。
实际上,您的代码中有一个错误: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)