2013-03-11 76 views
3

我在mvc4應用程序中使用log4net(用於學術目的)。我在Application_Start()方法中調用global.asax這種方法。如何在實例化後找到log4net實例?

log4net.Config.XmlConfigurator.Configure(); 

然後在我的應用程序的任何控制,我可以調用這個方法:

ILog _logger = LogManager.GetLogger(typeof(T)); 

問題是,當我打電話的Application_Start()方法Configure()方法,因爲,但我沒有存儲參考在任何變量中,GetLogger()方法如何知道在哪裏查找,更確切地說它在哪裏找到log4net實例?

就我個人而言,我無法想象它的路徑(除非我知道它的內存位置,它可能會被加載)。

回答

3

Log4net將其引用存儲在靜態變量中。 GetLogger方法有權訪問該變量並返回適當的值。 (實際上,我簡單地略過了一點,請參閱log4net源代碼瞭解詳細信息。)

這是the singleton pattern的變體。

順便說一句,你可以讓log4net創建多個記錄器實例(就像我說的,它是單例的變體)。爲此,請通過logger element配置其他記錄器,然後將通過元素的name屬性指定的名稱傳遞給LogManager.GetLogger()GetLogger方法將使用傳遞給它的名稱作爲相應靜態記錄器實例的查找鍵,並在您首次請求時創建該實例。

+0

單例模式把它清理了一下。所以GetLogger方法只是返回靜態Log4Net對象。這意味着只要已創建(使用靜態構造函數),就可以訪問任何靜態對象。即使它尚未創建,它會在第一次訪問時創建,對嗎? – Freeman 2013-03-11 15:20:46

+0

正確。記錄器在第一次訪問時創建。 – dgvid 2013-03-11 15:28:11