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