以编程方式更改log4net日志logging级别

这与650694类似,但是没有答案被接受,我根本得不到任何这些build议,我怀疑我可能会有一点点不同的情况。

我打电话给log4net.Config.XmlConfigurator.Configure()。 但是在程序中的那个点之后,我想把日志logging的阈值改变成仅在运行时已知的值。

从另外一个问题,我尝试了:

((log4net.Repository.Hierarchy.Logger)mylogger.Logger).Level = log4net.Core.Level.Error; 

和:

 var appender = new log4net.Appender.ColoredConsoleAppender(); appender.Layout = new log4net.Layout.PatternLayout(@"%date %-5level %message%newline"); appender.Threshold = log4net.Core.Level.Error; appender.ActivateOptions(); log4net.Config.BasicConfigurator.Configure(appender); 

但似乎没有任何影响:我仍然在控制台上看到DEBUG和INFO日志语句。

我的直觉是我添加了一个新的appender,它对XMLconfiguration中声明的appender没有影响(它告诉它打印DEBUG级别的消息),但是我还没有任何证据。

我一直在挖掘log4net API一段时间,而我只是没有看到它。 有没有简单的我失踪?

这些解决scheme没有在这里为我工作。 它在运行时不会改变

这是什么对我有用:

 ((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root.Level = Level.Debug; ((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).RaiseConfigurationChanged(EventArgs.Empty); 

您必须在更改configuration后调用RaiseConfigurationChanged。

终于在这里find了一个工作解决scheme

大件是:

  • 需要设置所有logging器的阈值,包括“不能被名称检索”的根logging器
  • 需要从Hierarchy的LevelMap中获取Level

非常感谢埃迪提出了很好的尖锐的问题,这使我得到了正确的答案。 我从来不会想到这一点。

(另外:Repository,Hierarchy,Logger,RootLogger,LevelMap – 我不知道甚至有可能使日志库变得复杂,它有20层的间接性,我相信它足够灵活,但是做简单的事情几乎是不可能的,比如“不要在阈值X以上logging任何消息”。

有一个简单的方法来做到这一点:

 LogManager.GetRepository().Threshold = Level.Info; 

更多信息可以在这里find。

试了所有这些答案,没有一个工作。 在debugging器中,我可以看到所有logging器级别,根级别,阈值都是按照指示设置的。 尽pipe如此,我没有看到我正在login的滚动文件中的任何日志级别的变化。

然后我发现在configuration文件中,appender元素也指定了一个阈值。 所以当我想在appender设置为Warn的时候把level改成Debug的时候,例如,appender没有select额外的消息,因为它们低于阈值。 所以我从appenderconfiguration中删除了阈值,并保持了级别configuration。

  <root> <level value="Warn" /> <appender-ref ref="RollingFile" /> </root> 

然后,我结束了使用肯的解决scheme来改变运行时的水平。

我正在寻找相同的方法,发现最新的NLog 3.2.0.0版给出了下面的选项来改变运行时的日志级别。

  LogManager.GlobalThreshold = LogLevel.Debug; 

我认为另一种方法可能是使用LogManager.Configuration来使用variables覆盖configuration设置。