OK,前面我已經知道了。Appender必須使用一個與之相關聯的Layout,這樣才能知道怎樣格式化輸出日誌信息。html
日誌格式化器Layout負責格式化日誌信息,方法log.error()的參數只包含日誌信息,利用Layout能夠附加其餘信息,以輸出更多的信息或者佈局顯示。java
HTMLLayout:格式化日誌輸出爲HTML表格web
XMLLayout:格式化日誌輸出爲XML文件apache
SimpleLayout:以一種很是簡單的方式格式化日誌輸出瀏覽器
TTCCLayout:包含日誌產生的時間、線程、類別等信息
app
這裏咱們詳細整理下該日誌格式化器。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該屬性的說明,該屬性設置了日誌輸出的格式,具體的參數以下:編碼
#自定義樣式 #%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
1,Log4j能輸出形形色色的參數,這些參數內容的長度不一樣。好比%C輸出的類名,有的類名很長,有的類名很短,這會致使日誌比較凌亂。爲了解決該問題,Log4j容許設置輸出內容的長度等,不夠長的會用空格補齊,使輸出內容變得整齊。spa
2,設置方法是在%與參數符號間添加數字,例如%20p,%-20p等。正數表示右對齊,負數表示左對齊,數字表示最小寬度,不足時用空格補齊。3,還能夠設置最大寬度,若是超出,則截取,方法是用小數點+數字設置,例如%.30p。
#輸出到文件(這裏默認爲追加方式) 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