我正在使用log4net的XML配置。我有以下appender-refs:
<root>
<level value="ALL" />
<appender-ref ref="ConsoleAppender" />
<appender-ref ref="OldRollingLogAppender" />
</root>
(我也在XML中定义了这些appender - 它们的确切实现应该无关紧要。)
我想在运行时删除OldRollingLogAppender
,然后创建并添加一个名为NewRollingLogAppender
的新帐户。我该怎么做呢?
最小的工作示例会很好。
答案 0 :(得分:1)
您可以通过获取根记录器然后添加和删除appender来执行此操作:
卸下:
var root = ((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root;
root.RemoveAppender(xxx);
添加:
var root = ((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root;
root.AddAppender(xxx);
您可以使用root.Appenders迭代appender列表 https://logging.apache.org/log4net/release/sdk/html/AllMembers_T_log4net_Repository_Hierarchy_RootLogger.htm
答案 1 :(得分:0)
除了彼得的回答,我必须做以下事情:
1)在添加或删除之前,我不得不打电话:
XmlConfigurator.Configure()
不首先执行此操作,log4net不会让我删除任何旧的appender。
2)当添加一个新的appender时,我不得不在运行时创建一个appender-in C#-I无法从XML中提取它。 (虽然......可能仍然可能......我可能只是做错了。)I.e。,
PatternLayout patternLayout = new PatternLayout();
patternLayout.ConversionPattern = ...;
patternLayout.ActivateOptions();
RollingFileAppender serviceAppender = new RollingFileAppender();
serviceAppender.Name = "NewRollingLogAppender";
serviceAppender.File = ...;
serviceAppender.DatePattern = ...;
serviceAppender.AppendToFile = ...;
serviceAppender.StaticLogFileName = ...;
serviceAppender.Layout = patternLayout;
serviceAppender.ActivateOptions();
3) 我的所有添加/删除代码完成后,我不得不打电话:
(Hierarchy)(LogManager.GetRepository()).RaiseConfigurationChanged(EventArgs.Empty);
如果不这样做,log4net就不会接收更改。
4)我观察到,XmlConfigurator.Configure()
被调用,它将创建并锁定与旧的(即,要移除的)appender相关联的任何日志文件。我不希望这发生。为了解决这个问题,我必须创建一个自定义的appender,它会覆盖OpenFile
,CloseWriter
和Append
。这样,我就可以在运行时决定是否“选择退出”在调用XmlConfigurator.Configure()
之前,这个appender。