Log4Net學習【二】

來源:互聯網
上載者:User

標籤:style   blog   http   io   color   ar   os   使用   sp   

Log4Net結構詳解

當我們在描述為系統做日誌這個動作的時候,實際上描述了3個點;做日誌,其實就是在規定,在什麼地方 用什麼日誌記錄器 以什麼樣的格式做日誌。把三個最重要的點抽取出來,即什麼地方,日誌記錄器,什麼格式。在Log4net中,就使用了三個最重要的組件來描述這三個要素,即Logger:日誌記錄器、Appender:什麼地方、 Layout:什麼格式。 下面我們就分別來看看這三個對象在Log4net中起的重要作用和一些基本的規則用法。

1、Logger

之前我們在建立Logger的時候,都是使用LogManager.GetLogger("seven");方法來得到一個類綁定的日誌記錄器的。實際上,當我們說把一個日誌記錄器綁定在一個類上,這種說法是不準確的,正確的說,我們僅僅是使用給定的類的全限定名為Logger取了一個名字。這裡請大家注意一下,Logger都是有名字的,假如我們除開rootLogger不談,我們可以把Logger想象成一張表裡面的資料,Logger對應的名字就是其主鍵,當兩個Logger的名字相同,這兩個Logger就是同一個Logger執行個體。我們可以簡單的通過一個執行個體來驗證:

View Code

控制台列印:30 [9] DEBUG  seven<null>  - true;說明Logger自身維護著每一個名字的Logger執行個體的引用,保證相同名字的Logger在不同地方擷取到的執行個體是一致的,這樣就允許我們在統一的代碼中配置不同Logger的特性。

另外,Logger的階層,也是靠Logger的名字來區分的,比如:名稱為DoNet的Logger就是DoNet.Seven的父Logger;DoNet.Seven是DoNet.Seven.Song的父Logger;Logger的體繫結構和命名空間的結構劃分類似,使用.來區分;所以我們前面才說,使用類的全限定名是最簡單,也是最符合logger的體繫結構的命名方式。當然,你也可能使用任何的能想到的方式去處理Logger的命名;這也是可以的。

看到這裡,可能有的人會提出疑問,那既然Logger的階層是按照Logger的名字來建立的,那在建立Logger的時候,是否必須按照其結構來順序建立Logger?比如:

 ILog log = LogManager.GetLogger("DoNet"); 

 ILog log = LogManager.GetLogger("DoNet.Seven"); 

 ILog log = LogManager.GetLogger("DoNet.Seven.Song");

是否必須要按照這個順序建立呢?不需要。在做前面的樣本的時候,我們說到,大家可能認為當我們通過ILog log = LogManager.GetLogger("DoNet.Seven.Song");的時候,Log4J其實為我們建立了DoNet;DoNet.Seven和DoNet.Seven.Song這三個Logger;其實不然,如果是這樣的話,Log4net可能會產生非常多不必要的Logger。所以,真正的方式應該是,當我通過ILog log = LogManager.GetLogger("DoNet.Seven.Song");的時候,Log4net僅僅為我們建立了DoNet.Seven.Song這個Logger;而當我們再次使用ILog log = LogManager.GetLogger("DoNet.Seven");的時候,Log4net才會為我們建立DoNet.Seven這個Logger,並且Log4net會自動的去尋找這個Logger的上下級關係,並自動的把這個新建立的Logger添加到已有的Logger結構體系中。

 在Logger中,非常重要的一個組件,就是Logger的記錄層級,即Level。關於Level的劃分,使用,我們在前面的例子中已經大概瞭解到了,下面來看看完整的Level的定義和其在Logger體系中的繼承方式,這是一個很簡單的概念。
首先,在Log4net中,為我們預設的定義了7種不同的Level層級,即all<debug<info<warn<error<fatal<off;而這7中Level層級又剛好對應著Level類中的7個預設執行個體:Level.ALL;Level.DEBUG;Level.INFO;Level.WARN;Level.ERROR;Level.FATAL和Level.OFF。我們在之前也只看到了其中的debug到fatal這5種;這五種記錄層級正好對應著Logger中的五個方法,即:
 void Debug(object message);

 void Info(object message);

 void Warn(object message);

 void Error(object message);

 void Fatal(object message);

當然也對應著一些擴充方法,方便使用,這裡不列舉了。Log4Net學習【一】我們已經介紹了Logger的基本使用,以及Level的使用和限制。其實,在真正使用Log4net的時候,我們一般都不需要使用代碼的方式去配置Level,這些配置更多的時候是使用設定檔來完成的,這個後面會詳細介紹。但是,不管使用什麼樣的設定檔,最終也會解釋成這樣的配置代碼,所以,理解了這些代碼,再去使用設定檔,會更加清楚到底設定檔在幹什麼

2、Appender

使用Logger的日誌記錄方法,僅僅是發出了日誌記錄的事件,具體日誌要記錄到什麼地方,需要Appender的支援。在Log4net中,Appender定義了日誌輸出的目的地。在上面所有的樣本當中,我們日誌輸出的目的地都是控制台,在Log4j中,還有非常多的Appender可供選擇,可以將日誌輸出到檔案,網路,資料庫等等,這個後面再介紹。說到這裡,可能有人就已經會思考,既然Logger對象的info()等方法僅僅是發出了日誌記錄的事件,還需要指定輸出目的地;那麼我們之前的範例程式碼也並沒有為任何一個Logger設定Appender啊?其實這很好理解,我們回顧一下之前的Level,按道理,也應該為每一個Logger指定對應的日誌輸出層級,但是我們也並沒有這樣做,正是因為Logger本身存在一個完整的體繫結構,而Level能夠在這個結構中自下而上的繼承。同理,Appender也具有這種繼承的特性.

 log4net.Config.BasicConfigurator.Configure();            ILog log = LogManager.GetLogger("DoNet.Seven");            log.Logger.Repository.Threshold = Level.Info;            #region 給log添加一個Append            IBasicRepositoryConfigurator configurableRepository = log.Logger.Repository as IBasicRepositoryConfigurator;            SimpleLayout layout=new SimpleLayout();            FileAppender appender = new FileAppender(layout, "test.log");            configurableRepository.Configure(appender);                        #endregion            ILog log2 = LogManager.GetLogger("DoNet.Seven.Song");            log.Debug("debug");            log.Info("Info");            log.Error("Error");            log2.Debug("Debug2");            log2.Info("Info2");            log2.Error("Error2");            Console.ReadKey();
View Code

結果如下:

這裡檔案中的輸出明顯已經和控制台的輸入不一致了,在這裡說明了兩個問題:

 

  

  

Log4Net學習【二】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.