gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:15:35 25 4
gpt4 key购买 nike

我将 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 projet 和 NLog 4.4.0-beta11(测试版但最后在 nuget 上),简单的"file"目标在配置文件中定义为 minLevel = Trace 和 autoReload=True

记录器在类级别实例化: 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

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

使用上面的代码,您应该很容易尝试。如果我做错了什么或者这是 NLog 配置管理中的错误,请告诉我。

最佳答案

实际上,您的代码中有一个错误: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

关于c# - 如何强制重新加载 NLog 配置文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37687546/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com