簡體   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