1. 程式人生 > >log4j日誌配置檔案詳解

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之後,就可以成功,列印日誌資訊了。

小結

遇到問題,解決問題,學習了一下日誌配置的相關資訊。