【问题标题】:Dynamically setting a log4net property using common.logging使用 common.logging 动态设置 log4net 属性
【发布时间】:2011-01-08 06:50:00
【问题描述】:

有谁知道 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

我最终得到的文件如下所示:Log_(null).txt 当使用 common.logging 即时连接 log4net 时。

【问题讨论】:

    标签: .net logging log4net apache-commons common.logging


    【解决方案1】:

    我认为通过common.logging 执行此操作没有意义,因为common.logging 旨在为实际日志记录实现提供一个外观,以便您可以在 log4net、NLog、EntLib 等之间切换而无需更改您的应用程序代码(但只是更改配置)。请注意,common.logging 为您提供了超过记录器 (ILog) 的外观,但没有超过日志接收器(log4net 中的附加程序)。因此,即使您可以配置 BrokerID 属性,也不清楚如何在其他日志记录后端使用它。

    【讨论】:

    • 如果每个 Common.Logging 附加程序通过相同的抽象将其路由到它后面的记录器,那么它确实有意义。
    【解决方案2】:

    请参阅我的answer 以了解上一个问题。也许会有所帮助,也许不会。

    总结一下:

    1. Common.Logging (NET) 在其 website 上表示,计划在“下一个”版本中支持“上下文”。

    2. website 上尚不清楚下一个版本(当前版本是 2.0)的时间安排。网站上写着“六月”。当前版本(2.0)是 2009 年 4 月。该网站最后一次更新是在 2009 年 5 月(可能宣布 2.0)? “六月”是什么意思? 2009 年 6 月? 2010 年 6 月?两者都来了又走了。

    3. 鉴于 Common.Logging 中尚不提供“上下文”支持,请查看 Castle 项目中的“上下文”实现(log4net 实现为 here)。将该实现移植到 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”(注意属性之前的点)。另外,请注意,我的回答引用了我之前发表的一篇文章(请参阅我的回答第一句中的链接),该文章描述了如何为 Common.Logging 实现上下文对象,因为当时 Common.Logging 没有上下文对象。最近没看Common.Logging,所以不知道有没有上下文对象,有的话语法是什么。
    • 啊,好吧,我不够仔细,抱歉责备你;),关于主题:使用依赖注入框架应该很容易为 log4net 的上下文属性公开包装器。您将使用一些针对每个 Web 请求运行的高级代码(或者,如果您不构建 Web 应用程序,则使用不同的起点)。在该代码库中,您可能无论如何都引用了 log4net,因为您需要配置适配器(通过 .config 文件或以编程方式)。
    【解决方案3】:

    我分叉了 Common.Logging 并添加了这个功能。

    GitHub projectNuGet

    我还提交了将更改返回到主分支/项目的拉取请求。

    【讨论】:

      猜你喜欢
      • 2011-01-15
      • 2020-01-08
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      • 1970-01-01
      相关资源
      最近更新 更多