2011-03-19 30 views
3

我們正在使用log4net來登錄我們的應用程序。我們希望在每次通話時自動捕獲某些信息。調用log.Info或log.Warn的代碼應該正常調用它們,而不指定此信息。擴展log4net - 向每個日誌添加額外數據

我正在尋找一種方法來創建我們可以插入log4net的東西。 ILog應用程序用於記錄日誌和appender之間的東西,以便我們可以以某種方式將這些信息放入日誌消息中。無論是ThreadContext還是LogEventInfo。

我們正在尋找的信息是與asp.net相關的;請求URL,用戶代理等。還有一些來自我們想要包含的apps .config文件的信息(應用程序ID)。

我想獲得正常的ILog.Info和appender,以便這些信息也自動包含在第三方庫中,這些庫也使用log4net(Nhibernate,NServiceBus等)。

任何關於我想要的可擴展性的建議是什麼?

謝謝

回答

2

你在找什麼叫做日誌事件上下文。本教程介紹了它的工作原理:

http://www.beefycode.com/post/Log4Net-Tutorial-pt-6-Log-Event-Context.aspx

特別章節「計算的語境值」會爲你有意思。

更新:

我的想法是利用全球範圍內的。很容易看出它是如何工作的,像應用程序ID(事實上,你甚至不需要計算的上下文對象)。像請求URL動態信息可以做這樣的:

public class RequestUrlContext 
{ 
    public override string ToString() 
    { 
     string url; 
     // retrieve url from request 
     return url; 
    } 
} 

對象是全球性的,但該方法被調用來處理請求的線程上,因此你會得到正確的信息。我還建議您爲每個「信息實體」創建一個類,以便您在日誌目標中的輸出具有很大的靈活性。

+1

我沒有看到完整的答案。在線程上下文中計算的上下文值會有所幫助,但是我不清楚在設置這些屬性時應該在asp.net上下文中發生,因爲每個請求都由線程池線程提供服務。我可以將代碼放入global.asax事件預請求處理程序之一中,但我希望能夠在不依賴於開發人員記住這樣做的情況下運行該解決方案。 – Andy 2011-03-20 21:09:14

+0

謝謝,我會很感激! – Andy 2011-03-21 22:41:51