我一直在使用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文檔的文件名,以便我可以將其附加到實際的日誌文件中作爲堆棧跟蹤的補充。
'FileAppender + MinimalLock'只應在需要時打開要寫入的文件。 –
是的,我認爲這一點,但我可以看到,只要運行應用程序,無論是否發生錯誤,都會創建該文件,然後我只在執行catch代碼塊時創建空XML。 – JsonStatham
這個問題似乎支持我的看法,我不應該使用log4net來做到這一點,因爲我在技術上不是'記錄'的XML文件,但保存爲補充:http://stackoverflow.com/questions/ 2533403/log4net的,如何對禁用創造-的空日誌文件上,應用程序啓動 – JsonStatham