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

27

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

我希望能够为主机和每个插件配置log4net。 它们每个都应该有自己的配置文件,且每个都将记录到不同的文件中。

只有主机有一个App.config文件。插件有自己的配置文件,其中包含log4net配置部分。

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

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

谢谢, Gai。

3个回答

16

看起来您已经找到了适合您的解决方案。然而,我发现另外一种解决方案,我认为它更加“理想”,因此我会将它发布在这里,以供将来可能遇到这个问题的人参考。

log4net有一个称为repositories的概念,可以单独配置。这不是很流行,也没有很好的文档,但这里是我找到的一些文档:

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

无论如何,您只需要在您的插件程序集或程序集上添加RepositoryAttribute,并为该插件指定唯一的存储库名称,log4net将保持其与其他所有内容分开。


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


你会怎么做呢?听起来是个不错的解决方案。这似乎并不容易,因为你需要仅保留一个“log4net”标签并合并该标签的内容。 - Wayne
我更新了我的回答,增加了更多细节。结果证明,它不需要太多代码,并且在每个环境中具有不同的日志记录设置,而无需采取额外的构建步骤是非常值得的。 - Kit
我知道我们不应该评论“谢谢”,但还是要说一声谢谢。虽然我已经有10年没有用过C#了,但是记得XmlConfigurationMerger让我的生活变得更轻松。感谢@Kit和Bruno两位! - Jeff Maass

2
我最近也遇到了这个问题。虽然不是我所谓的“理想解决方案”,但我认为目前最好的解决方案是使用XmlConfigurator类的ConfigureAndWatch方法。基本上,您需要使用特定的配置文件设置您的主机程序集日志记录器配置。当您的插件加载时,让它们将其配置元素写入同一配置文件中的log4net配置部分。由于log4net已被告知使用ConfigureAndWatch监视该文件的更改,因此当该文件添加了新数据时,log4net将重新加载配置,其中现在包括来自插件的配置元素。
这有点hackish,但它似乎有效。下一步当然将把它移动到我的日志框架中,以便对配置文件的访问被联合起来。
请注意,在插件配置被写入/保存并更新的配置被重新加载和应用于记录器存储库之间存在短暂延迟。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接