如何动态配置log4net ILog?

时间:2015-06-22 16:06:54

标签: logging log4net log4net-appender

我的应用程序在其web.config中有一个中央log4net定义,我用xmlConfigurator读取。除了那个中央记录器,我需要定义一些其他记录器,它们将写入各种日志文件/ DB。这些记录器的定义以xml格式存放在我的数据库中,在运行时我尝试从DB读取它们,将它们写入流,使用XmlConfigurator配置它们并将它们存储在ILog集合中(sb是一个StringBuilder,包含xml,logConfig.Type是xml中显示的记录器的名称:

byte[] byteArray = Encoding.UTF8.GetBytes(sb.ToString());
MemoryStream stream = new MemoryStream(byteArray);
log4net.Config.XmlConfigurator.Configure(stream);
ILog ilogRes = log4net.LogManager.GetLogger(logConfig.Type);
stream.Close();
return ilogRes;

ilogRes没有像我预期的那样配置(使用sb中定义的appender),而是作为中央记录器。我做错了什么?

更新: 最初的问题出现在我的XML中,一旦我删除了一个冗余元素,就会创建一个带有新appender的新记录器。现在的问题是新的记录器用两个appender写入,前一个和新的一个,而我希望新的记录器只用新的appender写。有没有办法告诉LogManager.GetLogger(X)只带来与appender X一起配置的appender?

1 个答案:

答案 0 :(得分:0)

我已将每个动态记录器配置到一个单独的存储库,这样记录器只包含当前配置中定义的appender:

byte[] byteArray = Encoding.UTF8.GetBytes(sb.ToString());
MemoryStream stream = new MemoryStream(byteArray);
log4net.Repository.ILoggerRepository repository = log4net.LogManager.CreateRepository(logConfig.Type);
log4net.Config.XmlConfigurator.Configure(repository, stream);
ILog ilogRes = log4net.LogManager.GetLogger(repository.Name, logConfig.Type);
相关问题