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

Ken*_*Ken 59 c# logging log4net

这与650694类似,但没有接受答案,我根本无法获得任何建议,我怀疑我的情况可能略有不同.

我正在调用log4net.Config.XmlConfigurator.Configure().但是在程序中的这一点之后,我想将日志记录阈值更改为仅在运行时已知的值.

从另一个问题,我试过:

((log4net.Repository.Hierarchy.Logger)mylogger.Logger).Level = log4net.Core.Level.Error;
Run Code Online (Sandbox Code Playgroud)

和:

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);
Run Code Online (Sandbox Code Playgroud)

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

我的预感是我正在添加一个新的appender,它对XML配置中声明的appender没有影响(它告诉它打印DEBUG级别的消息),但我还没有任何证据.

我一直在挖掘log4net API一段时间了,我只是没有看到它.我有什么简单的东西吗?

小智 86

这里提出的这些解决方案都不适用于我.它在运行时没有改变

这对我有用:

((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root.Level = Level.Debug;
((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).RaiseConfigurationChanged(EventArgs.Empty);
Run Code Online (Sandbox Code Playgroud)

您必须在更改其配置后调用RaiseConfigurationChanged.

  • 啊,我正在寻找的答案.这是我4年前的最后一次投票:) (5认同)

Ken*_*Ken 22

终于找到了工作液,在这里.

大件是:

  • 需要在所有记录器上设置阈值,包括"无法按名称检索"根记录器
  • 需要从Hierarchy的LevelMap获取Level

非常感谢Eddie提出好的尖锐问题,这让我得到了正确的话语.我再也不会想到这一点了.

(旁白:存储库,层次结构,记录器,RootLogger,LevelMap - 我不知道甚至有可能使这个复杂的日志库.它有大约20层间接,我确信它足够灵活,适合任何事情,但是几乎不可能做一些简单的事情,比如"不要记录超过阈值X的任何消息".哇!)


Ale*_*lex 8

有一个简单的方法:

LogManager.GetRepository().Threshold = Level.Info;
Run Code Online (Sandbox Code Playgroud)

更多信息可以在这里找到.

  • 一旦配置了日志记录,这不会更改日志记录级别. (5认同)
  • 您还必须通过RaiseConfigurationChanged告诉它配置已更改. (3认同)