我在ASP.NET MVC網站中使用(可能濫用)log4net。我想每個班級都有一個記錄器(which the docs suggest),但似乎我需要爲每個班級預先配置一個記錄器。Log4Net中的每種類型的動態記錄器
是嗎?我是否需要預先定義每個記錄器?
我正在追加到SqlServer &可以在架構中看到名爲Logger
的列。看起來應該很容易把我想要的東西放在這個領域,但是我能找到的唯一的動態記錄器創建是here。我錯過了什麼嗎?
我在ASP.NET MVC網站中使用(可能濫用)log4net。我想每個班級都有一個記錄器(which the docs suggest),但似乎我需要爲每個班級預先配置一個記錄器。Log4Net中的每種類型的動態記錄器
是嗎?我是否需要預先定義每個記錄器?
我正在追加到SqlServer &可以在架構中看到名爲Logger
的列。看起來應該很容易把我想要的東西放在這個領域,但是我能找到的唯一的動態記錄器創建是here。我錯過了什麼嗎?
您不需要預先定義每個記錄器。相反,傳統方法是使用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;
}
}
這裏的「動態」方面是什麼?你需要實例化一個記錄器來使用它,就像你必須實例化一個數據庫連接來使用它一樣。其餘的只是一個命名問題。
Log4net通過軟件組件可以很容易地命名記錄器。這可以通過靜態實例化每個類中的記錄器 來完成,記錄器名稱等於該類的全限定名。 這是一種定義記錄器的有用且直接的方法。
當你說每類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。
這個答案(&others)解釋它。什麼讓我失望的是log4net的例子,其中幾十個記錄器是用XML預先配置的。最重要的是,我的日誌沒有寫入,所以它讓我覺得我需要一個預先配置的記錄器,但我很高興地說這是錯誤的。感謝大家 – bendytree