2012-09-08 81 views
7

我想寫一個C#代碼,它通過log4net API在運行時檢索日誌文件的名稱模式。如何以編程方式獲取log4net日誌文件的名稱模式?

也就是說,如果log4net.config以下appender的定義:

<appender name="MyAppender" type="log4net.Appender.RollingFileAppender"> 
    <file type="log4net.Util.PatternString" value="%date{yyyy}\%date{MM}\%date{dd}\%property{Id}.log" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Size" /> 
    <maxSizeRollBackups value="16" /> 
    <maximumFileSize value="1MB" /> 
    <staticLogFileName value="true" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%message%newline" /> 
    </layout> 
</appender> 

我想獲得%日期{YYYY} \%{日期MM} \%{日期} DD \%property {Id} .log代碼中的字符串變量(無需解析log4net.config作爲純XML)。

有沒有人有一個想法來拉這個把戲?

預先感謝您。

回答

2

此模式的值將位於作爲日誌存儲庫一部分的FileAppender實例的File屬性中。

通過幾種不同的方式可以獲得appender。

  1. 如果你已經有了一個​​實例(例如你從LogManager.GetLogger()得到什麼)再有就是它的財產Appenders。這會給你任何與特定級別記錄相關的appender。
  2. 您也可以致電LogManager.GetRepository()以獲得包含整個記錄器和appender heirarchy的Heirarchy對象。該方法需要一個程序集,因此通過GetCallingAssembly()來獲取默認的程序集。這個類有一個GetAppenders()方法,它會返回所有配置的appender,但它不會告訴你哪些與哪些記錄器相關聯。

從那裏,只是期待通過尋找正確類型(例如FileAppenderRollingFileAppender)的附加目的地,然後讀取它的File財產。

+2

我認爲這是行不通的。文件屬性已經在那個時候被評估過了。因此它將不再包含'%date {yyyy} \%date {MM} \%date {dd} ...'但是'2012 \ 09 \ ...'。 – Wolfgang

+0

@Michael Wolfgang是絕對正確的:當檢索到_File_屬性已經被評估,並且我無法獲得原始模式值。 – Lev

+0

hrm。你是對的,我一直使用它來獲得路徑(我們通常不會模式化)並且從未注意到。這些數據必須在某處可用,因爲該模式在某個時刻被重新計算,讓我更深入地挖掘。 –

0

我認爲你想要子類RollingFileAppender,並在配置文件中使用你的子類,而不是基類。確保在全名稱空間前加上類名,以便log4net可以找到它。

我的代碼中只有一個UDPAppender子類。我說像這樣的控制裝置:在當地人窗口

public override void ActivateOptions() 
    { 
     base.ActivateOptions(); 
    } 

當我的基類呼叫打破了之前,我研究「這個」,看到的數值爲UDPAppender「成員」。

+0

不幸的是,_RollingFileAppender_的一個實例已經被賦值爲文件名並且不知道文件名稱模式。我猜想看到這個模式的最後一個對象是_ParseAppender()_方法中_log4net.Repository.Hierarchy.XmlHierarchyConfigurator_的一個實例。在這種情況下,實現我所需要的唯一方法就是自行解析配置文件(yuck!)... – Lev

+0

哦,我誤解了。你想要模式本身。我想有人可能會改變模式,所以你不想通過代碼來設置它(所以你會提前知道它)? – chrismead

0

Michael Edenfield的解釋很好。這是實現。

private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 

string fileName = ((RollingFileAppender)log.Logger.Repository.GetCurrentLoggers() 
    .Where(e => e.Name == "Your namespace.class").ToList()[0] 
    .Repository.GetAppenders() 
    .Where(e => e.Name == "MyAppender").ToList()[0]).File.ToString(); 
0

我能獲得<file value>用下面的代碼的價值:

((log4net.Appender.FileAppender) ((log4net.Appender.IAppender[]) 
      ((log4net.Repository.Hierarchy.Logger) 
       log.Logger).Appenders.SyncRoot)[0]).File 
相關問題