如何动态配置 log4net ILogs?

How can I configure log4net ILogs dynamically?

我的应用程序在其 web.config 中有一个中央 log4net 定义,我使用 xmlConfigurator 读取它。除了那个中央记录器之外,我还需要定义一些其他的记录器来写入各种日志 files/DBs。这些记录器的定义以 xml 格式位于我的数据库中,在运行时我尝试从数据库中读取它们,将它们写入流,同时使用 XmlConfigurator 配置它们并将它们存储在 ILog 集合中(sb是一个包含 xml 的 StringBuilder,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 中定义的附加程序),而是作为中央记录器。我做错了什么?

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

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

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);