Log4j快速入門
參考資料
官方文檔:https://logging.apache.org/log4j/2.x/
組件模塊:https://blog.csdn.net/Evankaka/article/details/45815047
layout模塊:https://blog.csdn.net/zengxiaosen/article/details/55804423
前言
因爲在學校的學習中,很少有接觸到日誌相關的內容,因此可以說是一個小白。當年剛參加工作時,我作爲小白碰到一個基本上完全陌生的事物log4j,又沒有師傅領路,可謂吃盡苦頭。幸好網上關於log4j的文檔也很多,當時的我也是翻閱了大量的文檔,才得以初步學會使用。寫這篇文章的契機是給一個同事討論需求時涉及到了log4j的相關內容,發現他完全沒有接觸過,然後討論就變成了單方面培訓(心裏苦啊)。爲了避免這種重複勞動,我查閱了很多log4j的相關文檔,並對他們進行了彙總和整理,特整理出一篇簡單的log4j入門文檔,供後來者閱讀和學習,本文是基於log4j-1.2.17進行編寫,需要有一定的java和maven基礎,只是針對log4j如何使用進行講解,方便閱讀者快速入門,使用log4j,不涉及深層內容。
概述
在代碼裏使用log是一種低成本的方法去debug它,經常被使用在多線程應用和高併發應用。使用log有很多優點,它可以提供一個在運行應用的準確上下文信息;日誌的輸出不需要人工干預;日誌可以存儲在持久化媒介中。
日誌也有其缺點,它會使應用變慢。log4j對次也進行了優化,提升了性能。
配置
log4j有三大組件:分別爲Logger、Appender、Layout,都通過log4j.properties進行配置。
Logger爲日誌記錄器,指定輸出日誌的級別和輸出的目的地即Appender。
Appender爲日誌附着器,用來指定日誌的輸出目標,例如輸出到控制檯、文件或者自定義組件如kafka消息隊列等。
Layout定義日誌輸出內容格式,結合Appender使用。
log4j.properties配置
log4j.rootLogger=DEBUG,console
log4j.logger.org=ERROR
log4j.logger.org.springframework=INFO,myLogFile
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d [%t] [%p] - %m%n
log4j.appender.myLogFile=org.apache.log4j.FileAppender
log4j.appender.myLogFile.file=c:/test-log.log
log4j.appender.myLogFile.layout=org.apache.log4j.PatternLayout
log4j.appender.myLogFile.layout.conversionPattern=%d [%c]-[%-5p]%m%n
Logger配置中,rootLogger是所有logger的父節點,對於一般的logger而言,如上文的log4j.logger.org.springframework,org.springframework即爲該logger的名字,INFO爲輸出級別,該logger只會輸出INFO級別以上(包括INFO)的日誌到後面的myLogFile appender中。
logger配置
#根logger配置
log4j.rootLogger=[level],appenderName1,appenderName2,...
#普通logger配置
log4j.logger.loggerName=[level],appenderName3,appenderName4,...
level爲日誌級別,除了自定義的日誌級別,一般的日誌級別從高到低爲OFF,FATAL,ERROR,WARN,INFO,DEBUG,ALL。一般日常中我們通常指用只用四個級別ERROR,WARN,INFO,DEBUG。level配置用於過濾日誌輸出,例如當配置的level爲INFO時,在程序中使用Logger.debug("some message"),日誌信息不會被打印出來,通過配置log4j.properties即可控制日誌輸出級別,debug通常用於測試環境,對業務進行調試。而生產環境中不需要那麼多DEBUG信息,通常將日誌級別設爲INFO。
appenderName*爲日誌輸出目的地,如上面log4j.properties中配置的console和myLogFile。
Appender和Layout配置
Appender配置日誌輸出的目的地,因爲Layout是定義日誌輸出格式的,需要結合Appender使用,所以這裏兩者結合起來一起介紹,其配置語法如下:
#配置appender使用類
log4j.appender.appenderName=appender.class
log4j.appender.appenderName.option1=value1
...
log4j.appender.appenderName.optionN=valueN
#配置appender的layout,appender通過使用option配置使用layout
log4j.appender.appenderName.layout = layout.class
log4j.appender.appenderName.layout.option1=value1
…
log4j.appender.appenderName.layout.optionN=valueN
Log4j已經提供了一些常用的appender類和layout類,如果已有的類無法滿足,Log4j中appender.class和layout.class也可以自定義,因爲是本文爲Log4j入門使用教程,就不再詳細深入了。
Log4j常用的自帶appender使用類如下:
org.apache.log4j.ConsoleAppender(控制檯)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌文件)
org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件)
org.apache.log4j.WriterAppender(將日誌信息以流格式發送到任意指定的地方)
Log4j常用的自帶layout類模板如下:
org.apache.log4j.HTMLLayout(以HTML表格形式佈局)
org.apache.log4j.PatternLayout(可以靈活地指定佈局模式)
org.apache.log4j.SimpleLayout(包含日誌信息的級別和信息字符串)
org.apache.log4j.TTCCLayout(包含日誌產生的時間、線程、類別等等信息)
Layout一般都需要有一個option參數conversionPattern來指定日誌輸出格式,例如本章節一開始的log4j.properties,我們可以看到該參數的value是由一串標識符組成的,我們通過這串標識符來控制日誌的輸出,常用的標識符如下:
-X: X信息輸出時左對齊
%p: 輸出日誌信息優先級,即DEBUG,INFO,WARN,ERROR,FATAL,
%d: 輸出日誌時間點的日期或時間,默認格式爲ISO8601,也可以在其後指定格式,比如:%d{yyyy-MM-dd HH:mm:ss,SSS},輸出類似:2011-10-18 22:10:28,921
%r: 輸出自應用啓動到輸出該log信息耗費的毫秒數
%c: 輸出日誌信息所屬的類目,通常就是所在類的全名
%t: 輸出產生該日誌事件的線程名
%l: 輸出日誌事件的發生位置,相當於%C.%M(%F:%L)的組合,包括類目名、發生的線程,以及在代碼中的行數。
%x: 輸出和當前線程相關聯的NDC(嵌套診斷環境),尤其用到像java servlets這樣的多客戶多線程的應用中。
%%: 輸出一個"%"字符
%F: 輸出日誌消息產生時所在的文件名稱
%L: 輸出代碼中的行號
%m: 輸出代碼中指定的消息,產生的日誌具體信息
%n: 輸出一個回車換行符,Windows平臺爲"\r\n",Unix平臺爲"\n"輸出日誌信息換行
實現
配置講解完,log4j的入門就已經完成了大半了,接下來,簡單就log4j使用進行介紹。
第一步,通過maven引入依賴,或者直接將jar包添加至lib下。
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j<artifactId>
<version>1.2.17</version>
</dependency>
第二步,添加log4j.properties配置文件到classpath下。
log4j.rootLogger=DEBUG,console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d [%t] [%p] - %m%n
第三步,在程序中使用log4j進行日誌輸出,這裏使用測試類Test進行測試,具體使用如下:
import org.apache.log4j.Logger;
public class Test {
private static Logger logger = Logger.getLogger(Test.class);
public static void main(String[] args) {
logger.debug("DEBUG ...");
logger.info("INFO ...");
logger.error("ERROR ...");
}
}
觀察控制檯即可得到輸出信息:
2019-12-25 21:47:13,332 [main] [DEBUG] - DEBUG ...
2019-12-25 21:47:13,333 [main] [INFO] - INFO ...
2019-12-25 21:47:13,333 [main] [ERROR] - ERROR ...
總結
本文僅僅是對log4j的一個初步入門,應付一些日常工作應該還是可以的,但如果要做到精通,本文是遠遠不夠的。可以通過結合官方文檔、源碼、網上文檔的方式,進行更加深入的學習,這就要靠各位自己了。我對log4j的掌握程度也就停留在本文的階段,如果將來有機會深入學習的話,可能還有續集,嘿嘿。