- Layout:格式化輸出日誌信息
OK,前面我已經知道了。Appender必須使用一個與之相關聯的Layout,這樣才能知道怎樣格式化輸出日誌信息。
日誌格式化器Layout負責格式化日誌信息,方法log.error()的參數只包含日誌信息,利用Layout可以附加其他信息,以輸出更多的信息或者佈局顯示。
- Log4j具有幾種類型的Layout
HTMLLayout:格式化日誌輸出爲HTML表格
XMLLayout:格式化日誌輸出爲XML文件
SimpleLayout:以一種非常簡單的方式格式化日誌輸出
TTCCLayout:包含日誌產生的時間、線程、類別等信息
- 實際編碼中,我們使用最多的就是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允許設置輸出內容的長度等,不夠長的會用空格補齊,使輸出內容變得整齊。
2,設置方法是在%與參數符號間添加數字,例如%20p,%-20p等。正數表示右對齊,負數表示左對齊,數字表示最小寬度,不足時用空格補齊。3,還可以設置最大寬度,如果超出,則截取,方法是用小數點+數字設置,例如%.30p。
- 關於HTMLLayout,XMLLayout這裏只做一個簡單的介紹。
配置如下:
- #輸出到文件(這裏默認爲追加方式)
- 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