繁体   English   中英

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

[英]Dynamically setting a log4net property using common.logging

有没有人知道Common.Logging(for .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

见我的回答上一个问题。 也许它会有所帮助,也许不会。

总结一下:

  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“context”支持在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接口获得“上下文”。

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

请参阅GitHub项目NuGet

我还提交了一个pull请求,用于将更改返回到主分支/项目。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM