log4j 2.5 使用教程詳解(怎麼使用log4j2)

前言
   log4j 1.x的版本你們都已經很熟悉了,由於項目須要咱們的項目由log4j 1.x的版本替換爲log4j 2.x的版本;這一替換沒關係,要改的內容卻不少,log4j 2.5/2.0的詳細用法以下,有問題歡迎留言探討:

1. 開始使用:
  咱們知道,要在某個類中使用log4j記錄日誌,只須要申明下面的成員變量(其實不必定要是成員變量,只是爲了方便調用而已)  
  log4j 2.5/2.0 申明變量與log4j 1.x的版本有些不一樣,具體以下:
     private static Logger logger = LogManager.getLogger(MyApp.class.getName());
 這裏getLogger有一個參數指定的是這個logger的名稱,這個名稱在配置文件裏面但是有須要的,這個待會兒再說。聲明瞭Logger對象,咱們就能夠在代碼中使用他了。

2. 日誌的級別:
  咱們如今要調用logger的方法,不過在這個Logger對象中,有不少方法,因此要先了解log4j的日誌級別,log4j規定了默認的幾個級別:        trace<debug<info<warn<error<fatal等。這裏要說明一下:
  1)級別之間是包含的關係,意思是若是你設置日誌級別是trace,則大於等於這個級別的日誌都會輸出。
  2)基本上默認的級別沒多大區別,就是一個默認的設定。你能夠經過它的API本身定義級別。你也能夠隨意調用這些方法,不過你要在配置文件裏面好好處理了,不然就起不到日誌的做用了,並且也不易讀,至關於一個規範,你要徹底定義一套也能夠,不用沒多大必要。

  3)這不一樣的級別的含義你們都很容易理解,這裏就簡單介紹一下:
    trace: 是追蹤,就是程序推動如下,你就能夠寫個trace輸出,因此trace應該會特別多,不過不要緊,咱們能夠設置最低日誌級別不讓他輸出。
    debug: 調試麼,我通常就只用這個做爲最低級別,trace壓根不用。是在沒辦法就用eclipse或者idea的debug功能就行了麼。
    info: 輸出一下你感興趣的或者重要的信息,這個用的最多了。
    warn: 有些信息不是錯誤信息,可是也要給程序員的一些提示,相似於eclipse中代碼的驗證不是有error 和warn(不算錯誤可是也請注意,好比如下depressed的方法)。
    error: 錯誤信息。用的也比較多。
    fatal: 級別比較高了。重大錯誤,這種級別你能夠直接中止程序了,是不該該出現的錯誤麼!不用那麼緊張,其實就是一個程度的問題。

3. 日誌調用:
  這裏隨便寫個類,調用就是這麼簡單,log4j的核心在配置文件上。
html

  1. import org.apache.logging.log4j.Level;
    程序員

  2. import org.apache.logging.log4j.LogManager;
    apache

  3. import org.apache.logging.log4j.Logger;
    json

  4. public class Hello {
    mybatis

  5.     static Logger logger = LogManager.getLogger(Hello.class.getName());
    app

  6.     public boolean hello() {
    框架

  7.         logger.entry();   //trace級別的信息,單獨列出來是但願你在某個方法或者程序邏輯開始的時候調用,和logger.trace("entry")基本一個意思
    eclipse

  8.         logger.error("Did it again!");   //error級別的信息,參數就是你輸出的信息
    分佈式

  9.         logger.info("我是info信息");    //info級別的信息
    ide

  10.         logger.debug("我是debug信息");

  11.         logger.warn("我是warn信息");

  12.         logger.fatal("我是fatal信息");

  13.         logger.log(Level.DEBUG, "我是debug信息");   //這個就是制定Level類型的調用:誰閒着沒事調用這個,也不必定哦!

  14.         logger.exit();    //和entry()對應的結束方法,和logger.trace("exit");一個意思

  15.         return false;

  16.     }

  17. }  

複製代碼

 若是沒有自定義配置文件,上面這個類在寫一個main方法,控制檯會輸入下面的樣子:

  1. 19:09:40.256 [main] ERROR cn.lsw.base.log4j2.Hello - Did it again!

  2. 19:09:40.260 [main] FATAL cn.lsw.base.log4j2.Hello - 我是fatal信息

複製代碼

看到沒,只有>=ERROR的日誌輸出來了(這是由於Log4j有一個默認的配置,它的日誌級別是ERROR,輸出只有控制檯)。若是我已經定義好了日誌,我把日誌級別改爲了TRACE,輸出會變成下面這樣: 

  1. 19:11:36.941 TRACE cn.lsw.base.log4j2.Hello 12 hello - entry

  2. 19:11:36.951 ERROR cn.lsw.base.log4j2.Hello 13 hello - Did it again!

  3. 19:11:36.951 INFO  cn.lsw.base.log4j2.Hello 14 hello - 我是info信息

  4. 19:11:36.951 DEBUG cn.lsw.base.log4j2.Hello 15 hello - 我是debug信息

  5. 19:11:36.951 WARN  cn.lsw.base.log4j2.Hello 16 hello - 我是warn信息

  6. 19:11:36.952 FATAL cn.lsw.base.log4j2.Hello 17 hello - 我是fatal信息

  7. 19:11:36.952 DEBUG cn.lsw.base.log4j2.Hello 18 hello - 我是debug信息

  8. 19:11:36.952 TRACE cn.lsw.base.log4j2.Hello 19 hello - exit

複製代碼

 全部的日誌都打印出來了,你們能夠對照上面的代碼看一看。

4. 配置文件:
  log4j是apache的一個開源項目,在寫這篇博客的時候已經發布了2.0的beta版本,首先須要注意的是,log4j 2.0與以往的1.x有一個明顯的不一樣,其配置文件只能採用.xml, .json或者 .jsn,新建配置文件 在 classpath(classpath爲scr文件夾)下名爲 log4j2.xml

 原本覺得Log4J 2應該有一個默認的配置文件的,不過好像沒有找到,下面這個配置文件等同於缺省配置

  1. <?xml version="1.0" encoding="UTF-8"?>


  2. <configuration status="error">

  3.     <!--先定義全部的appender-->

  4.     <appenders>

  5.         <!--這個輸出控制檯的配置-->

  6.         <Console name="Console" target="SYSTEM_OUT">

  7.             <!--控制檯只輸出level及以上級別的信息(onMatch),其餘的直接拒絕(onMismatch)-->

  8.             <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>

  9.             <!--這個都知道是輸出日誌的格式-->

  10.             <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>

  11.         </Console>

  12.         <!--文件會打印出全部信息,這個log每次運行程序會自動清空,由append屬性決定,這個也挺有用的,適合臨時測試用-->

  13.         <File name="log" fileName="log/test.log" append="false">

  14.             <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>

  15.         </File>


  16.         <!--這個會打印出全部的信息,每次大小超過size,則這size大小的日誌會自動存入按份-月份創建的文件夾下面並進行壓縮,做爲存檔-->

  17.         <RollingFile name="RollingFile" fileName="logs/app.log"

  18.                      filePattern="log/${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">

  19.             <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>

  20.             <SizeBasedTriggeringPolicy size="50MB"/>

  21.         </RollingFile>

  22.     </appenders>

  23.     <!--而後定義logger,只有定義了logger並引入的appender,appender纔會生效-->

  24.     <loggers>

  25.         <!--創建一個默認的root的logger-->

  26.         <root level="trace">

  27.             <appender-ref ref="RollingFile"/>

  28.             <appender-ref ref="Console"/>

  29.         </root>


  30.     </loggers>

  31. </configuration>

複製代碼

說複雜,其實也不復雜,這一個例子主要是爲了講一下appenders。
  這裏定義了三個appender,Console,File,RollingFile,看意思基本也明白,第二個是寫入文件,第三個是「循環」的日誌文件,意思是日誌文件大於閥值的時候,就開始寫一個新的日誌文件。

  這裏咱們的配置文件裏面的註釋算比較詳細的了。因此就你們本身看了。有一個比較有意思的是ThresholdFilter ,一個過濾器,其實每一個appender能夠定義不少個filter,這個功能頗有用。若是你要選擇控制檯只能輸出ERROR以上的類別,你就用ThresholdFilter,把level設置成ERROR,onMatch="ACCEPT" 的意思是匹配就接受,不然直接拒絕,固然有其餘選擇了,好比交給其餘的過濾器去處理了之類的,詳情你們本身去琢磨吧。

  爲何要加一個這樣的配置文件呢?其實這個配置文件我感受挺好的,他的實用性就在下面:
一個實用的配置文件:

  咱們用日誌一方面是爲了記錄程序運行的信息,在出錯的時候排查之類的,有時候調試的時候也喜歡用日誌。因此,日誌若是記錄的很亂的話,看起來也不方便。因此我可能有下面一些需求:

  1)我正在調試某個類,因此,我不想讓其餘的類或者包的日誌輸出,不然會不少內容,因此,你能夠修改上面root的級別爲最高(或者謹慎起見就用ERROR),而後,加一個針對該類的logger配置,好比第一個配置文件中的設置,把他的level設置trace或者debug之類的,而後咱們給一個appender-ref是定義的File那個appender(共三個appender,還記得嗎),這個appender的好處是有一個append爲false的屬性,這樣,每次運行都會清空上次的日誌,這樣就不會由於一直在調試而增長這個文件的內容,查起來也方便,這個和輸出到控制檯就一個效果了。

  2)我已經基本上部署好程序了,而後我要長時間運行了。我須要記錄下面幾種日誌,第一,控制檯輸出全部的error級別以上的信息。第二,我要有一個文件輸出是全部的debug或者info以上的信息,相似作程序記錄什麼的。第三,我要單獨爲ERROR以上的信息輸出到單獨的文件,若是出了錯,只查這個配置文件就行了,不會去處理太多的日誌,看起來頭都大了。怎麼作呢,很簡單。

  >首先,在appenders下面加一個Console類型的appender,經過加一個ThresholdFilter設置level爲error。(直接在配置文件的Console這個appender中修改)

  >其次,增長一個File類型的appender(也能夠是RollingFile或者其餘文件輸出類型),而後經過設置ThresholdFilter的level爲error,設置成File好在,你的error日誌應該不會那麼多,不須要有多個error級別日誌文件的存在,不然你的程序基本上能夠重寫了。
  這裏能夠添加一個appender,內容以下:

  1. <File name="ERROR" fileName="logs/error.log">

  2.             <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>

  3.             <PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>

複製代碼

並在loggers中的某個logger(如root)中引用(root節點加入這一行做爲子節點)。 

  1. <appender-ref ref="ERROR" />

複製代碼

  >而後,增長一個RollingFile的appender,設置基本上同上面的那個配置文件。
  >最後,在logger中進行相應的配置。不過若是你的logger中也有日誌級別的配置,若是級別都在error以上,你的appender裏面也就不會輸出error一下的信息了。

  還記得上面的Test類裏面有一個被註釋掉的for循環麼?這個是爲了作配置文件中RollingFile那個appender的配置的,取消註釋,運行商一次或幾回,看你的輸出配置文件的地方,他是怎麼「RollingFile」的,這裏給個我測試的截圖:(這裏你能夠把 <SizeBasedTriggeringPolicy size="50MB"/>這裏的size改爲2MB,要生成50MB的日誌仍是比較慢的。爲了方便觀察麼!而後把Console的ThresholdFilter的level設置成error這樣的較高級別,否則控制檯輸出東西太多了
來源:佳雲網版權全部,轉載請註明來源和連接!
連接: http://www.garyun.com/thread-581-1-1.html

【編輯推薦】

相關文章
相關標籤/搜索