使用common.logging动态设置log4net属性

3
有人知道在Common.Logging(.Net)中是否有类似的功能来设置log4net工厂适配器的属性吗?我只使用log4net时已经取得了很大的成功,方法如下:
<appender name="FileAppender" type="log4net.Appender.RollingFileAppender">
    <file type="log4net.Util.PatternString" value="logs\Log_%property{BrokerID}.txt"/>
    <appendToFile value="false"/>
    <rollingStyle value="Size"/>
    <maxSizeRollBackups value="-1"/>
    <maximumFileSize value="50GB"/>
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %-5level %logger - %message%newline"/>
    </layout>
</appender>

设置属性的方式如下:log4net.GlobalContext.Properties["BrokerID"] = 10

当使用common.logging动态连接log4net时,最终生成的文件名为:Log_(null).txt

3个回答

3
请参考我之前的回答:点击这里。也许它会有所帮助,也可能不会。
总结一下:
1. Common.Logging(NET)在其网站上表示,计划在“下一个”版本中支持“上下文”。
2. 在网站上并没有明确说明下一个版本(当前版本为2.0)的发布时间。该网站上写着“六月”。当前版本(2.0)发布于2009年4月。该网站最后一次更新是在2009年5月(也许是为了宣布2.0版)?“六月”是什么意思?2009年6月?2010年6月?两个日期都已经过去了。
3. 鉴于Common.Logging尚未提供“上下文”支持,请查看Castle项目中的“上下文”实现(log4net实现在这里)。将该实现移植到Common.Logging并不难。风险在于,最终来自Common.Logging的上下文实现可能与Castle实现不同。
4. Castle的“上下文”支持是在ILog/ILogger接口上实现的。因此,设置上下文不是像这样:
通过log4net直接访问上下文:
log4net.GlobalContext.Properties["BrokerID"] = 10;

通过日志抽象访问上下文:

ILog logger = Common.Logging.LogManager.GetCurrentClassLogger();
logger.GlobalContext.Properties["BrokerID"] = 10;

从设置日志记录器的角度来看,这似乎相当不错。但如果你只想在没有获取日志记录器的情况下设置上下文,则可能不太好。如果Common.Logging.LogManager知道哪个抽象是“活动”的(它应该知道,因为抽象可以通过LogManager.Adapter属性进行设置/获取),那么“上下文”也可以从ILog接口以及LogManager.Adapter接口中获得。


在2.1中的什么地方?我的第一个例子,log4net.GlobalContextProperties 显然应该是 "log4net.GlobalContext.Properties"(注意 Properties 前面的点)。此外,请注意我的答案提到了我之前发表的一篇帖子(请参见答案第一句中的链接),该帖子描述了如何为 Common.Logging 实现上下文对象,因为当时的 Common.Logging 没有上下文对象。我最近没有看过 Common.Logging,所以我不知道它是否具有上下文对象,如果有,语法是什么。 - wageoghe
啊,好的,我没有仔细看,抱歉责怪你;),关于主题:使用依赖注入框架应该很容易公开log4net上下文属性的包装器。您将在每个Web请求(或不构建Web应用程序的其他起点)运行的某些高级代码中使用它。在该代码库中,您可能已经引用了log4net,因为您需要配置适配器(通过.config文件或以编程方式)。 - Jaap

2
我复制了Common.Logging并添加了这个功能。
请参见GitHub项目NuGet
我还提交了一个拉取请求,将更改返回到主分支/项目。

0

我认为通过common.logging这样做没有意义,因为common.logging旨在提供一个外观,以覆盖实际的日志记录实现,这样您就可以在不更改应用程序代码的情况下(仅更改配置)在log4net、NLog、EntLib等之间切换。请注意,common.logging为您提供了日志记录器(ILog)的外观,但并没有覆盖日志记录器的接收器(即log4net术语中的appenders)。因此,即使您可以配置BrokerID属性,也不清楚它如何在其他日志后端中使用。


如果每个Common.Logging appender通过相同的抽象将其路由到其后面的记录器,那么这是有意义的。 - Danny Varod

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