2014-05-13 30 views
2

我一直在使用log4net來捕獲在我的應用程序運行期間發生的任何異常,這個異常運行正常,然後我創建了自己的靜態方法,負責捕獲失敗的XML旨在提供進一步閱讀以補充日誌條目的對象。log4net爲每個log.info調用寫入單個文件

public static void WriteReceiptToXml(Exception ex, string XmlReceipt) 
{ 
    if (XmlReceipt != null) 
    { 
     string filename = ConfigurationManager.AppSettings["XmlReceiptPath"] + "/ReceiptXml" + DateTime.Now.ToString("ddMMyyhhmmss") + ".xml"; 
     File.WriteAllText(filename, XmlReceipt); 
     Logger.Error(string.Format("The Xml Receipt was written to {0}", filename)); 
    } 

    else 
     Logger.Error("The Xml Receipt was empty so no document was created. Please reference the Payment request XML"); 
} 

這個效果很好,但是一個更有經驗的同事認爲,這是一個代碼味道的升技和我是有效地重新發明輪子,因爲我已經使用log4net的這個任務應該由處理它也。

此時我在Web.config文件(下面)中創建了一個新的appender,並在INFO級別對其進行過濾,然後我意識到只要運行應用程序,log4net就會創建XML文件是否catch塊捕獲異常,如果沒有錯誤發生,它將保持爲空,這顯然不是我想要的。

<appender name="ReceiptXmlAppender" type="log4net.Appender.FileAppender" > 
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
    <file type="log4net.Util.PatternString" value="App_Data/ReceiptXml/Receipt-%date{yyyy-MM-dd_HH-mm-ss}.xml"/> 
    <appendToFile value="false" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%m" /> 
    </layout> 
    <filter type="log4net.Filter.LevelRangeFilter"> 
    <param name="LevelMin" value="INFO"/> 
    <param name="LevelMax" value="INFO"/> 
    </filter> 
</appender> 

總之我要的是:

  • log4net的僅創建於INFO方法的XML被稱爲我的catch塊
  • 1文件被創建我每次通話記錄時間。 INFO
  • 該文件必須加蓋日期時間
  • 我需要知道所創建的XML文檔的文件名,以便我可以將其附加到實際的日誌文件中作爲堆棧跟蹤的補充。
+1

'FileAppender + MinimalLock'只應在需要時打開要寫入的文件。 –

+0

是的,我認爲這一點,但我可以看到,只要運行應用程序,無論是否發生錯誤,都會創建該文件,然後我只在執行catch代碼塊時創建空XML。 – JsonStatham

+0

這個問題似乎支持我的看法,我不應該使用log4net來做到這一點,因爲我在技術上不是'記錄'的XML文件,但保存爲補充:http://stackoverflow.com/questions/ 2533403/log4net的,如何對禁用創造-的空日誌文件上,應用程序啓動 – JsonStatham

回答

0

如果您使用基本的FileAppender或其衍生工具之一,那麼您運氣不好;只要appender在ActivateOptions()方法中初始化,就會創建該文件。從我看到你需要一個自定義的FileAppender來處理你的所有業務規則。那就需要

  • 覆蓋默認ActivateOptions方法,以防止文件創建
  • 覆蓋的Append方法來創建當消息被記錄在LoggingEvent類傳入
  • 使用數據的新時間戳的文件(你有該類可用的一些屬性)來檢索文件名;您必須在記錄之前確定文件名。

除非你想從行爲中獲益它已經實現了(模擬例如),我會從FileAppender類建議跳過繼承和直接從TextWriterAppender類繼承。