log4net - 使用多个配置文件进行配置

Gai*_*Gai 26 log4net log4net-configuration

我有一个由主机和可插拔模块(插件)组成的应用程序.

我希望能够为主机和每个其他模块配置log4net.它们中的每一个都应该有自己的配置文件,每个文件都会记录到不同的文件中.

只有主机具有App.config文件.插件有自己的配置文件,包含log4net配置部分.

从其中一个插件调用XmlConfigurator.Configure会覆盖主机的app.config log4net定义.

是否有一种简单的方法来添加配置而不是覆盖它们?

谢谢,盖.

Tin*_*ter 16

您似乎已经找到了适合您的解决方案.但是,我发现了一个我认为"更理想"的不同解决方案,所以我会在这里发布,以便将来可能会发现这个问题.

log4net有一个名为repositories的概念,可以单独配置.它不是很受欢迎,也没有很好的文档记录,但这里有一些我发现的文档:

http://logging.apache.org/log4net/release/manual/repositories.html

无论如何,您需要做的就是添加RepositoryAttribute插件程序集或程序集,并使用该插件独有的存储库名称,log4net将使其与其他所有内容分开.


Kit*_*Kit 5

另一种方法是在多个位置拥有多个 log4net 配置文件,将它们全部加载到一个文件中XDocument以有效地组成一个配置文件,然后调用XmlConfigurator.Configure()

我这样做的方法是按照配置的 XSD 创建每个文件,将每个文件的log4net根节点的所有子节点加载到单独的XElement实例中,并将它们合并到带有XDocument根节点的新实例中log4net

查找文件是另一回事:使用某种约定来扫描文件(例如*.dll.log4net.config),将它们嵌入到程序集中,或者以其他方式将它们与模块打包在一起。

Bruno Marotta在这里提供了此类代码的实现:

www.kopf.com.br/kaplof/using-multiple-configuration-files-with-log4net


Stu*_*lds 2

我自己刚刚遇到了这个问题。虽然这并不完全是我所说的“理想”,但我认为目前最好的解决方案是使用ConfigureAndWatch类的方法XmlConfigurator。基本上,您的主机程序集使用特定的配置文件设置 log4net 配置。当您的插件加载时,让它们将其配置元素写入同一配置文件中的 log4net 配置部分。由于 log4net 已被告知要监视该文件的更改ConfigureAndWatch,因此当文件添加了新数据时,log4net 将重新加载配置,该配置现在将包括来自插件的配置元素。

这有点hackish,但似乎有效。当然,下一步会将其移至我的日志记录框架中,以便联合对配置文件的访问。

请注意,写入/保存插件的配置与重新加载并应用到记录器存储库的更新配置之间存在短暂的延迟。