Log4j擴展使用--日誌格式化器Layout


  • Layout:格式化輸出日誌信息

OK,前面我已經知道了。Appender必須使用一個與之相關聯的Layout,這樣才能知道怎樣格式化輸出日誌信息。html

日誌格式化器Layout負責格式化日誌信息,方法log.error()的參數只包含日誌信息,利用Layout能夠附加其餘信息,以輸出更多的信息或者佈局顯示。java


  • Log4j具備幾種類型的Layout
PatternLayout:根據指定的轉換模式格式化日誌輸出

HTMLLayout:格式化日誌輸出爲HTML表格web

XMLLayout:格式化日誌輸出爲XML文件apache

SimpleLayout:以一種很是簡單的方式格式化日誌輸出瀏覽器

TTCCLayout:包含日誌產生的時間、線程、類別等信息
app


  • 實際編碼中,咱們使用最多的就是PatternLayout佈局。

這裏咱們詳細整理下該日誌格式化器。PatternLayout是最經常使用的格式化器,用戶能夠自定義信息,好比日期,時間,所在的線程,類型,方法名等等。佈局

下面是一份PatternLayout的配置文件。測試

# 如下是rootLogger的配置,子類默認繼承,可是子類重寫下面配置=rootLogger+本身配置,我暈
#輸出到控制檯   
log4j.appender.console=org.apache.log4j.ConsoleAppender  
#設置輸出樣式   
log4j.appender.console.layout=org.apache.log4j.PatternLayout 
#日誌輸出信息格式爲
log4j.appender.console.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n 
#DEBUG以上級別輸出,Threshold,入口,臨界值
#log4j.appender.console.Threshold=DEBUG
#日誌編碼方式
#log4j.appender.console.Encoding=UTF-8
#是否當即輸出
#log4j.appender.console.ImmediateFlush=true
#使用System.error做爲輸出
#log4j.appender.console.Target=System.error

  • 使用ConversionPattern自定義樣式

關於ConversionPattern該屬性的說明,該屬性設置了日誌輸出的格式,具體的參數以下:編碼

#自定義樣式   
#%c	輸出所屬的類目,一般就是所在類的全名 
#%C	輸出Logger所在類的名稱,一般就是所在類的全名 
#%d	輸出日誌時間點的日期或時間,默認格式爲ISO8601,也能夠在其後指定格式,好比:%d{yyy MMM dd HH:mm:ss , SSS},%d{ABSOLUTE},%d{DATE}
#%F	輸出所在類的類名稱,只有類名。
#%l	輸出語句所在的行數,包括類名+方法名+文件名+行數
#%L	輸出語句所在的行數,只輸出數字
#%m	輸出代碼中指定的訊息,如log(message)中的message
#%M	輸出方法名
#%p	輸出日誌級別,即DEBUG,INFO,WARN,ERROR,FATAL
#%r	輸出自應用啓動到輸出該log信息耗費的毫秒數
#%t	輸出產生該日誌事件的線程名
#%n	輸出一個回車換行符,Windows平臺爲「/r/n」,Unix平臺爲「/n」
#%%	用來輸出百分號「%」
#log4j.appender.Linkin.layout.ConversionPattern=%n[%l%d{yy/MM/dd HH:mm:ss:SSS}][%C-%M] %m  
#log4j.appender.Linkin.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}[%C]-[%p] %m%n   
#log4j.appender.Linkin.layout.ConversionPattern = %d{ABSOLUTE} %5p %t %c{2}:%L - %m%n

  • 關於該PatternLayout格式化器的補充:

1,Log4j能輸出形形色色的參數,這些參數內容的長度不一樣。好比%C輸出的類名,有的類名很長,有的類名很短,這會致使日誌比較凌亂。爲了解決該問題,Log4j容許設置輸出內容的長度等,不夠長的會用空格補齊,使輸出內容變得整齊。spa

2,設置方法是在%與參數符號間添加數字,例如%20p,%-20p等。正數表示右對齊,負數表示左對齊,數字表示最小寬度,不足時用空格補齊。

3,還能夠設置最大寬度,若是超出,則截取,方法是用小數點+數字設置,例如%.30p。






  • 關於HTMLLayout,XMLLayout這裏只作一個簡單的介紹。
HTMLLayout將日誌格式化爲HTML代碼,輸出到文件後,能夠直接用瀏覽器瀏覽。使用該格式化器時,日誌文件後綴通常爲.html。
配置以下:
#輸出到文件(這裏默認爲追加方式)   
log4j.appender.file=org.apache.log4j.FileAppender 
#輸出文件位置
log4j.appender.file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/log4j.log
#是否在原日誌基礎上追加輸出日誌。true,默認,追加。false,清掉原來日誌從新添加
log4j.appender.file.Append=true
#樣式爲TTCCLayout   
#log4j.appender.file.layout=org.apache.log4j.TTCCLayout
#樣式爲HTMLLayout
log4j.appender.file.layout=org.apache.log4j.HTMLLayout
log4j.appender.file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/log4j.html
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n  

運行咱們的測試代碼,而後生成了log4j.html。用瀏覽器打開查看日誌內容:


XMLLayout把日誌內容格式化成XML文件,XML文件的好處就是解析比較容易,由於有現成的DOM技術和SAX技術。配置時候只須要將appender的layout設置爲XMLLayout便可。

值得注意的是:XMLLayout生成的並非完整的XML文件,而只是XML文件的一部分,所以是沒法直接打開和解析的。


OK,到目前爲止,有關Log4j的使用和配置我都整理完了。這裏來總結一下:

1,Java代碼中獲取Logger。經過org.apache.log4j.Logger類的getLogger()方法便可。

public static Logger log = Logger.getLogger(Log4jTest1.class);

固然若是咱們在配置Log4j的時候,若是配置文件路徑沒有按照約定加入到classpath中的話,咱們也能夠經過Java代碼去加載該配置文件。

BasicConfigurator.configure():自動快速地使用缺省Log4j環境。
PropertyConfigurator.configure(StringconfigFilename):讀取使用Java的特性文件編寫的配置文件。
DOMConfigurator.configure(Stringfilename):讀取XML形式的配置文件。

最後咱們就能夠直接使用日誌對象來輸出日誌了。調用log對象的各類輸出日誌方法,好比debug(),好比info()方法等等。

2,配置Log4j。要使用配置文件才能配置Log4j→log4j.xml配置文件後者log4j.properties配置文件

一般,咱們都提供一個名爲log4j.properties的文件,在第一次調用到Log4J時,Log4J會在類路徑(../web-inf/class/固然也能夠放到其它任何目錄,只要該目錄被包含到類路徑中便可)中定位這個文件,並讀入這個文件完成的配置。這個配置文

件告訴Log4J以什麼樣的格式、把什麼樣的信息、輸出到什麼地方。


最後這裏貼出一份最完整的log4j.properties文件。

#	可設置級別:TRACE→DEBUG→INFO→WARNING→ERROR→FATAL→OFF
#	高級別level會屏蔽低級別level。
#	debug:顯示debug、info、error   
#	info:顯示info、error   

#log4j.rootLogger=DEBUG,console,file
#子類從新定義日誌級別,logger的名字是日誌類的權限類名
#log4j.logger.org.linkinpark.commons.logtest.Log4jTest1=ERROR
#子類從新定義日誌級別,category的名字是日誌類的包名,能夠將category理解爲Java的package。
#log4j.category.org.linkinpark.commons.logtest1=ERROR,file,rolling_file,daily_rolling_file
log4j.rootLogger=DEBUG,console,daily_rolling_file

# 如下是rootLogger的配置,子類默認繼承,可是子類重寫下面配置=rootLogger+本身配置,我暈
#輸出到控制檯   
log4j.appender.console=org.apache.log4j.ConsoleAppender  
#設置輸出樣式   
log4j.appender.console.layout=org.apache.log4j.PatternLayout 
#日誌輸出信息格式爲
log4j.appender.console.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n 
#DEBUG以上級別輸出,Threshold,入口,臨界值
#log4j.appender.console.Threshold=DEBUG
#日誌編碼方式
#log4j.appender.console.Encoding=UTF-8
#是否當即輸出
#log4j.appender.console.ImmediateFlush=true
#使用System.error做爲輸出
#log4j.appender.console.Target=System.error

#輸出到文件(這裏默認爲追加方式)   
log4j.appender.file=org.apache.log4j.FileAppender 
#輸出文件位置
log4j.appender.file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/log4j.log
#是否在原日誌基礎上追加輸出日誌。true,默認,追加。false,清掉原來日誌從新添加
log4j.appender.file.Append=true
#樣式爲TTCCLayout   
#log4j.appender.file.layout=org.apache.log4j.TTCCLayout
#樣式爲HTMLLayout
log4j.appender.file.layout=org.apache.log4j.HTMLLayout
log4j.appender.file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/log4j.html
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n  

#按大小滾動文件(這裏默認爲追加方式)   
log4j.appender.rolling_file=org.apache.log4j.RollingFileAppender 
#輸出文件位置
log4j.appender.rolling_file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/rolling_log4j.log
log4j.appender.rolling_file.Append=true
#文件達到最大值自動改名
log4j.appender.rolling_file.MaxFileSize=1KB
#最多備份100個文件
log4j.appender.rolling_file.MaxBackupIndex=100
log4j.appender.rolling_file.layout=org.apache.log4j.PatternLayout
log4j.appender.rolling_file.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n

#按日期滾動文件
log4j.appender.daily_rolling_file=org.apache.log4j.DailyRollingFileAppender 
#輸出文件位置
log4j.appender.daily_rolling_file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/daily_rolling_log4j.log
#文件滾動日期格式
#天天:.YYYY-MM-dd(默認)
#每星期:.YYYY-ww
#每個月:.YYYY-MM
#每隔半天:.YYYY-MM-dd-a
#每小時:.YYYY-MM-dd-HH
#每分鐘:.YYYY-MM-dd-HH-mm
#log4j.appender.daily_rolling_file.DatePattern=.yyyy-MM-dd
log4j.appender.daily_rolling_file.DatePattern=.YYYY-MM-dd-HH-mm
log4j.appender.daily_rolling_file.layout=org.apache.log4j.PatternLayout
log4j.appender.daily_rolling_file.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n

#自定義樣式   
#%c	輸出所屬的類目,一般就是所在類的全名 
#%C	輸出Logger所在類的名稱,一般就是所在類的全名 
#%d	輸出日誌時間點的日期或時間,默認格式爲ISO8601,也能夠在其後指定格式,好比:%d{yyy MMM dd HH:mm:ss , SSS},%d{ABSOLUTE},%d{DATE}
#%F	輸出所在類的類名稱,只有類名。
#%l	輸出語句所在的行數,包括類名+方法名+文件名+行數
#%L	輸出語句所在的行數,只輸出數字
#%m	輸出代碼中指定的訊息,如log(message)中的message
#%M	輸出方法名
#%p	輸出日誌級別,即DEBUG,INFO,WARN,ERROR,FATAL
#%r	輸出自應用啓動到輸出該log信息耗費的毫秒數
#%t	輸出產生該日誌事件的線程名
#%n	輸出一個回車換行符,Windows平臺爲「/r/n」,Unix平臺爲「/n」
#%%	用來輸出百分號「%」
#log4j.appender.Linkin.layout.ConversionPattern=%n[%l%d{yy/MM/dd HH:mm:ss:SSS}][%C-%M] %m  
#log4j.appender.Linkin.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}[%C]-[%p] %m%n   
#log4j.appender.Linkin.layout.ConversionPattern = %d{ABSOLUTE} %5p %t %c{2}:%L - %m%n
相關文章
相關標籤/搜索