我有一个由主机和可插拔模块(插件)组成的应用程序。
我希望能够为主机和其他每个模块配置 log4net。他们每个人都应该有自己的配置文件,并且每个人都将登录到不同的文件。
只有主机有 App.config 文件。插件有自己的配置文件,其中包含 log4net 配置部分。
从插件之一调用 XmlConfigurator.Configure 会覆盖主机的 app.config log4net 定义。
有没有一种简单的方法来附加配置而不是覆盖它们?
谢谢,盖。
我有一个由主机和可插拔模块(插件)组成的应用程序。
我希望能够为主机和其他每个模块配置 log4net。他们每个人都应该有自己的配置文件,并且每个人都将登录到不同的文件。
只有主机有 App.config 文件。插件有自己的配置文件,其中包含 log4net 配置部分。
从插件之一调用 XmlConfigurator.Configure 会覆盖主机的 app.config log4net 定义。
有没有一种简单的方法来附加配置而不是覆盖它们?
谢谢,盖。
看来您已经找到了适合您的解决方案。但是,我找到了一个我认为“更理想”的不同解决方案,因此我将在此处发布它以供将来可能会发现此问题的任何人使用。
log4net 有一个称为存储库的概念,可以单独配置。它不是很受欢迎,也不是很好的文档,但这是我找到的一些文档:
http://logging.apache.org/log4net/release/manual/repositories.html
无论如何,您需要做的就是添加RepositoryAttribute
您的插件程序集或具有该插件唯一的存储库名称的程序集,log4net 会将其与其他所有内容分开。
另一种方法是在多个位置拥有多个 log4net 配置文件,将它们全部加载到一个XDocument
以有效地组合一个,然后调用XmlConfigurator.Configure()。我这样做的方法是在配置的 XSD 之后创建每个文件,将每个文件的log4net
根节点的所有子节点加载到单独的XElement
实例中,然后将它们合并到XDocument
具有根节点的新实例中log4net
。如果有人进一步感兴趣,我会用代码更新这个答案(目前不在我面前)。
查找文件是另一回事:使用某种约定来扫描文件(例如*.dll.log4net.config
),将它们嵌入到程序集中,或其他东西。
可以在以下位置找到此类代码的实现:
www.kopf.com.br/kaplof/using-multiple-configuration-files-with-log4net
我自己也遇到了这个问题。虽然这不是我所说的“理想”,但我认为目前最好的解决方案是使用类的ConfigureAndWatch
方法XmlConfigurator
。基本上,您的主机程序集使用特定的配置文件设置 log4net 配置。当您的插件加载时,让他们将其配置元素写入同一配置文件中的 log4net 配置部分。由于 log4net 已被告知使用 监视该文件的更改ConfigureAndWatch
,因此当文件添加了新数据时,log4net 将重新加载配置,该配置现在将包含插件中的配置元素。
这有点骇人听闻,但似乎有效。下一步当然是将其移动到我的日志框架中,以便联合访问配置文件。
请注意,在插件的配置被写入/保存和更新的配置被重新加载并应用到记录器存储库之间存在短暂的延迟。