2012-10-04 52 views
3

我在ASP.NET MVC網站中使用(可能濫用)log4net。我想每個班級都有一個記錄器(which the docs suggest),但似乎我需要爲每個班級預先配置一個記錄器。Log4Net中的每種類型的動態記錄器

是嗎?我是否需要預先定義每個記錄器?

我正在追加到SqlServer &可以在架構中看到名爲Logger的列。看起來應該很容易把我想要的東西放在這個領域,但是我能找到的唯一的動態記錄器創建是here。我錯過了什麼嗎?

回答

5

您不需要預先定義每個記錄器。相反,傳統方法是使用log4net記錄器的標準模式,該記錄器使用消費類中的反射來聲明Type的記錄器。只是轉儲這個屬性到每個班級,你是好去:

private static log4net.ILog _logger; 
private static log4net.ILog Logger 
{ 
    get 
    { 
     if(_logger == null) 
     { 
      Type type = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType; 
      _logger = log4net.LogManager.GetLogger(type); 
     } 
     return _logger; 
    } 
} 
+0

這個答案(&others)解釋它。什麼讓我失望的是log4net的例子,其中幾十個記錄器是用XML預先配置的。最重要的是,我的日誌沒有寫入,所以它讓我覺得我需要一個預先配置的記錄器,但我很高興地說這是錯誤的。感謝大家 – bendytree

1

這裏的「動態」方面是什麼?你需要實例化一個記錄器來使用它,就像你必須實例化一個數據庫連接來使用它一樣。其餘的只是一個命名問題。

Log4net通過軟件組件可以很容易地命名記錄器。這可以通過靜態實例化每個類中的記錄器 來完成,記錄器名稱等於該類的全限定名。 這是一種定義記錄器的有用且直接的方法。

4

當你說每類1個日誌,你指的是綱領性ILog的,它是用來創建日誌消息。這些都實際上需要進行預定義,但如果你不關心定義可能不被使用的ILog它是作爲該方法簡單是地鐵藍精靈給了,或者更簡單:

private static ILog logger = 
    LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

無論是這些方法將配置一個記錄器。反射用於獲取當前方法的類名,然後將其用作記錄器名稱,因此將方法稱爲「動態」。這也可以編碼爲以下代碼(但每個類中的代碼都不相同,反射方法使得代碼片段變得容易)。

private static ILog logger = LogManager.GetLogger(typeof(MyCurrentClass)); 

每您的評論關於「把我想做的事情」,你可以很輕鬆地做到這一點還當您創建的ILog實例(和原諒雙關語)。

private static ILog logger = LogManager.GetLogger("whatever I want"); 

您包含的鏈接不僅會創建一個ILog記錄器,但它會創建一個appender以配合它。我不認爲這是一個好習慣,因爲appender可以在web.config或app.config中的運行時更容易地配置,並且通常不需要有多於一個或兩個appender,並且所有的記錄器輸出去appenders。