前言
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
import org.apache.logging.log4j.Level;
程序員
import org.apache.logging.log4j.LogManager;
apache
import org.apache.logging.log4j.Logger;
json
public class Hello {
mybatis
static Logger logger = LogManager.getLogger(Hello.class.getName());
app
public boolean hello() {
框架
logger.entry(); //trace級別的信息,單獨列出來是但願你在某個方法或者程序邏輯開始的時候調用,和logger.trace("entry")基本一個意思
eclipse
logger.error("Did it again!"); //error級別的信息,參數就是你輸出的信息
分佈式
logger.info("我是info信息"); //info級別的信息
ide
logger.debug("我是debug信息");
logger.warn("我是warn信息");
logger.fatal("我是fatal信息");
logger.log(Level.DEBUG, "我是debug信息"); //這個就是制定Level類型的調用:誰閒着沒事調用這個,也不必定哦!
logger.exit(); //和entry()對應的結束方法,和logger.trace("exit");一個意思
return false;
}
}
複製代碼
若是沒有自定義配置文件,上面這個類在寫一個main方法,控制檯會輸入下面的樣子:
19:09:40.256 [main] ERROR cn.lsw.base.log4j2.Hello - Did it again!
19:09:40.260 [main] FATAL cn.lsw.base.log4j2.Hello - 我是fatal信息
複製代碼
看到沒,只有>=ERROR的日誌輸出來了(這是由於Log4j有一個默認的配置,它的日誌級別是ERROR,輸出只有控制檯)。若是我已經定義好了日誌,我把日誌級別改爲了TRACE,輸出會變成下面這樣:
19:11:36.941 TRACE cn.lsw.base.log4j2.Hello 12 hello - entry
19:11:36.951 ERROR cn.lsw.base.log4j2.Hello 13 hello - Did it again!
19:11:36.951 INFO cn.lsw.base.log4j2.Hello 14 hello - 我是info信息
19:11:36.951 DEBUG cn.lsw.base.log4j2.Hello 15 hello - 我是debug信息
19:11:36.951 WARN cn.lsw.base.log4j2.Hello 16 hello - 我是warn信息
19:11:36.952 FATAL cn.lsw.base.log4j2.Hello 17 hello - 我是fatal信息
19:11:36.952 DEBUG cn.lsw.base.log4j2.Hello 18 hello - 我是debug信息
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應該有一個默認的配置文件的,不過好像沒有找到,下面這個配置文件等同於缺省配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="error">
<!--先定義全部的appender-->
<appenders>
<!--這個輸出控制檯的配置-->
<Console name="Console" target="SYSTEM_OUT">
<!--控制檯只輸出level及以上級別的信息(onMatch),其餘的直接拒絕(onMismatch)-->
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
<!--這個都知道是輸出日誌的格式-->
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</Console>
<!--文件會打印出全部信息,這個log每次運行程序會自動清空,由append屬性決定,這個也挺有用的,適合臨時測試用-->
<File name="log" fileName="log/test.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
<!--這個會打印出全部的信息,每次大小超過size,則這size大小的日誌會自動存入按份-月份創建的文件夾下面並進行壓縮,做爲存檔-->
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="log/${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
<SizeBasedTriggeringPolicy size="50MB"/>
</RollingFile>
</appenders>
<!--而後定義logger,只有定義了logger並引入的appender,appender纔會生效-->
<loggers>
<!--創建一個默認的root的logger-->
<root level="trace">
<appender-ref ref="RollingFile"/>
<appender-ref ref="Console"/>
</root>
</loggers>
</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,內容以下:
<File name="ERROR" fileName="logs/error.log">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
複製代碼
並在loggers中的某個logger(如root)中引用(root節點加入這一行做爲子節點)。
<appender-ref ref="ERROR" />
複製代碼
>而後,增長一個RollingFile的appender,設置基本上同上面的那個配置文件。【編輯推薦】