淺談Log4j和Log4j2的區別

 

相信不少程序猿朋友對log4j都很熟悉,log4j能夠說是陪伴了絕大多數的朋友開啓的編程。我不知道log4j以前是用什麼,至少在個人生涯中,是log4j帶我開啓的日誌時代。

log4j是Apache的一個開源項目,咱們不去考究它的起源時間,可是據我瞭解,log4j 1已經再也不更新了。 
下面引用官網的原文:程序員

End of Life On August 5, 2015 the Logging Services Project Management 
Committee announced that Log4j 1.x had reached end of life. For 
complete text of the announcement please see the Apache Blog. Users of 
Log4j 1 are recommended to upgrade to Apache Log4j 2. 
是的,log4j中止於1.x版本,迎來了log4j 2,也就是咱們今天要說的log4j 2.web

回顧log4j,曾給咱們留下了多少的回憶,我記得早些年,那時候mybatis仍是叫ibatis的時候,我爲了配置ibatis控制檯打印日誌,糾結了多少個夜晚,最後配置出來時的那種喜悅感。廢話很少說,下面我就以列舉的方式來淺談log4j和log4j 2的不一樣之處。spring

1.配置文件類型 
log4j是經過一個.properties的文件做爲主配置文件的,而如今的log4j 2則已經棄用了這種方式,採用的是.xml,.json或者.jsn這種方式來作,可能這也是技術發展的一個必然性,畢竟properties文件的可閱讀性真的是有點差。apache

2.核心JAR包 
log4j只須要引入一個jar包便可,編程

<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>

 

 

而log4j 2則是須要2個核心json

<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.5</version> </dependency>

 

 

你們發現沒,log4j和log4j 2的包路徑是不一樣的,Apache爲了區分,包路徑都更新了,這樣你們甚至能夠在一個項目中使用2個版本的日誌輸出哦!(不過我想大家沒有那麼調皮吧,嘿嘿)api

3.文件渲染 
log4j想要生效,咱們須要在web.xml中進行配置,markdown

<listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>classpath:config/log4j.properties</param-value> </context-param> <context-param> <param-name>log4jRefreshInterval</param-name> <param-value>60000</param-value> 

 

 

這段配置目的在於告訴工程去哪加載log4j的配置文件和定義一個掃描器,這樣能夠爲所欲爲的放置log4j配置文件。 
log4j2就比較簡單,以maven工程爲例,咱們只須要把log4j2.xml放到工程resource目錄下就好了。你們記住一個細節點,是log4j2.xml,而不是log4j.xml,xml名字少個2都不行!!mybatis

  • 喜歡作學問的小夥伴,有興趣能夠去研究下,照我估計應該是在log4j2的包裏面配置死了,並且你們能夠嘗試下怎麼自定義log4j2.xml的位置。

4.Log調用 
log4j和log4j2調用都是很簡單的。 
log4j:app

import org.apache.log4j.Logger; private final Logger LOGGER = Logger.getLogger(Test.class.getName());

log4j2:

import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; private static Logger logger = LogManager.getLogger(Test.class.getName());

 

 

5.配置文件方式 
最關鍵的最大的不一樣,那就是配置文件的區別了,你們具體使用的時候再根據你的狀況進行配置就好了。 
log4j2 例子以下:

<?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屬性決定,這個也挺有用的,適合臨時測試用 --> <!-- append爲TRUE表示消息增長到指定文件中,false表示消息覆蓋指定的文件內容,默認值是true --> <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> <!-- 添加過濾器ThresholdFilter,能夠有選擇的輸出某個級別以上的類別 onMatch="ACCEPT" onMismatch="DENY"意思是匹配就接受,不然直接拒絕 --> <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"/> </File> <!-- 這個會打印出全部的信息,每次大小超過size,則這size大小的日誌會自動存入按年份-月份創建的文件夾下面並進行壓縮,做爲存檔 --> <RollingFile name="RollingFile" fileName="logs/web.log" filePattern="logs/$${date:yyyy-MM}/web-%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="2MB"/> </RollingFile> </appenders> <!-- 而後定義logger,只有定義了logger並引入的appender,appender纔會生效 --> <loggers> <!-- 創建一個默認的root的logger --> <root level="trace"> <appender-ref ref="RollingFile"/> <appender-ref ref="Console"/> <appender-ref ref="ERROR" /> <appender-ref ref="log"/> </root> </loggers> </configuration> 

 

 

總結: 
技術老是在不斷進步的,咱們不能侷限在已知的知識領域中,要不斷去創新,去嘗試!

附:

日誌的級別:     
咱們如今要調用logger的方法,不過在這個Logger對象中,有不少方法,因此要先了解log4j的日誌級別,log4j規定了默認的幾個級別:trace<debug<info<warn<error<fatal等。這裏要說明一下:    

  1. 級別之間是包含的關係,意思是若是你設置日誌級別是trace,則大於等於這個級別的日誌都會輸出。
  2. 基本上默認的級別沒多大區別,就是一個默認的設定。你能夠經過它的API本身定義級別。你也能夠隨意調用這些方法,不過你要在配置文件裏面好好處理了,不然就起不到日誌的做用了,並且也不易讀,至關於一個規範,你要徹底定義一套也能夠,不用沒多大必要。從咱們實驗的結果能夠看出,log4j默認的優先級爲ERROR或者WARN(其實是ERROR)    
  3. 這不一樣的級別的含義你們都很容易理解,這裏就簡單介紹一下:

    • trace: 
      是追蹤,就是程序推動如下,你就能夠寫個trace輸出,因此trace應該會特別多,不過不要緊,咱們能夠設置最低日誌級別不讓他輸出。

    debug: 調試麼,我通常就只用這個做爲最低級別,trace壓根不用。是在沒辦法就用eclipse或者idea的debug功能就行了麼。

    • info: 輸出一下你感興趣的或者重要的信息,這個用的最多了。

    • warn: 有些信息不是錯誤信息,可是也要給程序員的一些提示,相似於eclipse中代碼的驗證不是有error 
      和warn(不算錯誤可是也請注意,好比如下depressed的方法)。

    • error: 錯誤信息。用的也比較多。

    • fatal: 級別比較高了。重大錯誤,這種級別你能夠直接中止程序了,是不該該出現的錯誤麼!不用那麼緊張,其實就是一個程度的問題。

相關文章
相關標籤/搜索