log4j日誌配置檔案詳解
部落格來由,前一段時間,架構組統一修改了log4j的檔案,修改之後,單元測試日誌就打印不出來了。所以就學習了一下log4j.properties檔案的配置。
1.log4j是什麼?
Log4j是Apache的一個開放原始碼專案,通過使用Log4j,
(1)我們可以控制日誌資訊輸送的目的地是控制檯、檔案、GUI元件、甚至是套介面伺服器、NT的事件記錄器、UNIX Syslog守護程序等;我們也可以控制每一條日誌的輸出格式;
(2)通過定義每一條日誌資訊的級別,我們能夠更加細緻地控制日誌的生成過程。優點是,這些可以通過一個配置檔案來靈活地進行配置,而不需要修改應用的程式碼。
(3)可以在多種語言中使用log4j,其語法和用法與在Java程式中一樣,使得多語言分散式系統得到一個統一一致的日誌元件模組
2.組成部分
由三個重要的元件構成,日誌資訊的優先順序,日誌資訊的輸出目的地,日誌資訊的輸出格式。級別建議只使用四個級別,優先順序從高到低分別為ERROR,Warn,Info,Debug.
。分別執行這條資訊的重要程度。
(1)日誌級別
(2)日誌資訊的輸出目的
指定了日誌將列印到控制檯還是檔案中。
其中,Log4j提供的layout有以下幾種:
org.apache.log4j.ConsoleAppender(控制檯),
org.apache.log4j.FileAppender(檔案),
org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌檔案),
org.apache.log4j.RollingFileAppender(檔案大小到達指定尺寸的時候產生一個新的檔案),
org.apache.log4j.WriterAppender(將日誌資訊以流格式傳送到任意指定的地方)
(3)輸出格式
控制了日誌資訊的顯示內容。其中,Log4j提供的layout有以下幾種:
org.apache.log4j.HTMLLayout(以HTML表格形式佈局),
org.apache.log4j.PatternLayout(可以靈活地指定佈局模式),
org.apache.log4j.SimpleLayout(包含日誌資訊的級別和資訊字串),
org.apache.log4j.TTCCLayout(包含日誌產生的時間、執行緒、類別等等資訊)
Log4J採用類似C語言中的printf函式的列印格式格式化日誌資訊,列印引數如下: %m 輸出程式碼中指定的訊息
%p 輸出優先順序,即DEBUG,INFO,WARN,ERROR,FATAL
%r 輸出自應用啟動到輸出該log資訊耗費的毫秒數
%c 輸出所屬的類目,通常就是所在類的全名
%t 輸出產生該日誌事件的執行緒名
%n 輸出一個回車換行符,Windows平臺為“rn”,Unix平臺為“n”
%d 輸出日誌時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
%l 輸出日誌事件的發生位置,包括類目名、發生的執行緒,以及在程式碼中的行數
(4)三種方式總結
• Logger類:完成日誌記錄,設定日誌資訊級別
• Appender類:決定日誌去向,終端、DB、硬碟
• Layout類:決定日誌輸出的樣式,例如包含當前執行緒、行號、時間
3.重點配置解析
(1) log4j.rootLogger=info, stdout,file
等號後面的第一個引數表示日誌級別,可以填五個級別中的一種,後面的引數都是讓Log知道輸出到哪裡,如果你想讓日誌輸出到兩個地方就加兩個輸出引數,比如:
log4j.rootLogger=info, stdout, file
這裡的info表示,該Log的日誌級別為info,所有級別小於info的日誌都不會被記錄
staout和file的作用。名字是隨便起的,你可以叫它A。比如:
Log4j.appender.A=org.apache.log4j.ConsoleAppender.
那麼上面的rootLogger的引數也要改為A,其他用到的地方當然也要改。這裡關鍵不是名字,而是appender型別。比如這裡的consoleAppender.
(2)log4j thread 屬性指定輸出等級
log4j.appender.A.Threshold=DEBUG
log4j.appender.B.Threshold=WARN
表示A的接收級別為debug,而B的接收級別為warn。這樣,A就可以看到debug以上的所有日誌,而寫入B的只有warn級別以上的日誌。
og4j.logger.XX cover ==> log4j.rootLogger
log4j.appender.XX.Threshold決定了最低接收級別
也就是說rootLogger首先決定所有log的輸出級別,而log4j.logger.XX是對XX路徑下的jar包的輸出級別的修改,直接覆蓋rootLogger
比如我設定如下:
log4j.rootLogger=debug,CONSOLE,file
log4j.appender.CONSOLE.Threshold=info
這個info級別會覆蓋dubug的資訊。最後控制檯上輸出的是info級別的資訊。
4.專案中的應用
(1)dubbo支援
在dubbo框架內所有的日誌輸出都是通過
LoggerFactory這個靜態工廠類來獲得Logger的物件實體,並且抽離了一個LoggerAdapter用於對接第三方日誌框架,所以就有了JDKLoggerAdapter,Log4jLoggerAdapter,SLF4JLogg erAdapter等一些實現子類,分別對接了不同Log第三方實現。這些子類的優先順序如下,這裡的優先順序是隻未配置指定的logger提供方的情況下,由dubbo框架自己選擇。
第三方日誌框架 優先順序
Log4j 最高(預設就用這個)
SLF4J 次高
Common Logging(jcl就是common logging) 次低(Log4j和SLF4J在專案中均沒有就用這個)
JDK log 最低 (最後的選擇)
(2)專案中配置如下
# ##設定日誌級別
# log4j.rootLogger=info,debug,CONSOLE,file
log4j.rootLogger=debug,CONSOLE,file
# ## 指定輸出資訊到控制檯
log4j.addivity.org.apache=true
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
# thread屬性,指定日誌level.根據日誌的重要程度,可以分為off,fatal,error,warn,info,debug。
log4j.appender.CONSOLE.Threshold=info
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.Encoding= UTF-8
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.appender1.MaxFileSize=100KB
# ##輸出Debug級別以上的日誌到log資料夾下。
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.DatePattern=yyyyMMdd
log4j.appender.file.File=../logs/teachingManagementService.log
# 每天的日誌列印就不需要設定大小屬性
# log4j.appender.file.MaxFileSize=20MB
# log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d [%X{uuid}] [%X{ip}] [%X{userId}] %-5p %l - %m%n
log4j.logger.com.alibaba.dubbo=error
(3)日誌打印不出來原因?
專案中設定列印級別,設定為了error。如下
log4j.rootLogger=ERROR,CONSOLE,file
log4j.appender.CONSOLE.Threshold=ERROR
設定為error之後,在生產環境中,只打印錯誤資訊是可以的。但是如果是本地單元測試時,如果列印級別設定為error,就打印不出來日誌資訊。所以走單元測試,好多日誌資訊就打印不出來。將日誌級別修改成為info或者debug之後,就可以成功,列印日誌資訊了。
小結
遇到問題,解決問題,學習了一下日誌配置的相關資訊。