在运行时附加或分离appender

时间:2016-12-08 22:28:38

标签: c# .net log4net

我正在使用log4net的XML配置。我有以下appender-refs:

<root>
  <level value="ALL" />
  <appender-ref ref="ConsoleAppender" />
  <appender-ref ref="OldRollingLogAppender" />
</root>

(我也在XML中定义了这些appender - 它们的确切实现应该无关紧要。)

我想在运行时删除OldRollingLogAppender,然后创建并添加一个名为NewRollingLogAppender的新帐户。我该怎么做呢?

最小的工作示例会很好。

2 个答案:

答案 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()).RaiseConfigurationCh‌​anged(EventArgs.Empt‌​y);

如果不这样做,log4net就不会接收更改。

4)我观察到,XmlConfigurator.Configure()被调用,它将创建并锁定与旧的(即,要移除的)appender相关联的任何日志文件。我不希望这发生。为了解决这个问题,我必须创建一个自定义的appender,它会覆盖OpenFileCloseWriterAppend。这样,我就可以在运行时决定是否“选择退出”在调用XmlConfigurator.Configure()之前,这个appender。