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

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

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

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


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

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

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

SimpleLayout:以一種非常簡單的方式格式化日誌輸出

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


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

這裏我們詳細整理下該日誌格式化器。PatternLayout是最常用的格式化器,用戶可以自定義信息,比如日期,時間,所在的線程,類型,方法名等等。

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

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. # 以下是rootLogger的配置,子類默認繼承,但是子類重寫下面配置=rootLogger+自己配置,我暈  
  2. #輸出到控制檯     
  3. log4j.appender.console=org.apache.log4j.ConsoleAppender    
  4. #設置輸出樣式     
  5. log4j.appender.console.layout=org.apache.log4j.PatternLayout   
  6. #日誌輸出信息格式爲  
  7. log4j.appender.console.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n   
  8. #DEBUG以上級別輸出,Threshold,入口,臨界值  
  9. #log4j.appender.console.Threshold=DEBUG  
  10. #日誌編碼方式  
  11. #log4j.appender.console.Encoding=UTF-8  
  12. #是否立即輸出  
  13. #log4j.appender.console.ImmediateFlush=true  
  14. #使用System.error作爲輸出  
  15. #log4j.appender.console.Target=System.error  

  • 使用ConversionPattern自定義樣式

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

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. #自定義樣式     
  2. #%c 輸出所屬的類目,通常就是所在類的全名   
  3. #%C 輸出Logger所在類的名稱,通常就是所在類的全名   
  4. #%d 輸出日誌時間點的日期或時間,默認格式爲ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS},%d{ABSOLUTE},%d{DATE}  
  5. #%F 輸出所在類的類名稱,只有類名。  
  6. #%l 輸出語句所在的行數,包括類名+方法名+文件名+行數  
  7. #%L 輸出語句所在的行數,只輸出數字  
  8. #%m 輸出代碼中指定的訊息,如log(message)中的message  
  9. #%M 輸出方法名  
  10. #%p 輸出日誌級別,即DEBUG,INFO,WARN,ERROR,FATAL  
  11. #%r 輸出自應用啓動到輸出該log信息耗費的毫秒數  
  12. #%t 輸出產生該日誌事件的線程名  
  13. #%n 輸出一個回車換行符,Windows平臺爲“/r/n”,Unix平臺爲“/n”  
  14. #%% 用來輸出百分號“%”  
  15. #log4j.appender.Linkin.layout.ConversionPattern=%n[%l%d{yy/MM/dd HH:mm:ss:SSS}][%C-%M] %m    
  16. #log4j.appender.Linkin.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}[%C]-[%p] %m%n     
  17. #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這裏只做一個簡單的介紹。
HTMLLayout將日誌格式化爲HTML代碼,輸出到文件後,可以直接用瀏覽器瀏覽。使用該格式化器時,日誌文件後綴一般爲.html。
配置如下:
[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. #輸出到文件(這裏默認爲追加方式)     
  2. log4j.appender.file=org.apache.log4j.FileAppender   
  3. #輸出文件位置  
  4. log4j.appender.file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/log4j.log  
  5. #是否在原日誌基礎上追加輸出日誌。true,默認,追加。false,清掉原來日誌重新添加  
  6. log4j.appender.file.Append=true  
  7. #樣式爲TTCCLayout     
  8. #log4j.appender.file.layout=org.apache.log4j.TTCCLayout  
  9. #樣式爲HTMLLayout  
  10. log4j.appender.file.layout=org.apache.log4j.HTMLLayout  
  11. log4j.appender.file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/log4j.html  
  12. #log4j.appender.file.layout=org.apache.log4j.PatternLayout  
  13. #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()方法即可。

[java] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. public static Logger log = Logger.getLogger(Log4jTest1.class);  

當然如果我們在配置Log4j的時候,如果配置文件路徑沒有按照約定加入到classpath中的話,我們也可以通過Java代碼去加載該配置文件。

[java] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. BasicConfigurator.configure():自動快速地使用缺省Log4j環境。  
  2. PropertyConfigurator.configure(StringconfigFilename):讀取使用Java的特性文件編寫的配置文件。  
  3. DOMConfigurator.configure(Stringfilename):讀取XML形式的配置文件。  

最後我們就可以直接使用日誌對象來輸出日誌了。調用log對象的各種輸出日誌方法,比如debug(),比如info()方法等等。

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

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

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


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

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. #   可設置級別:TRACE→DEBUG→INFO→WARNING→ERROR→FATAL→OFF  
  2. #   高級別level會屏蔽低級別level。  
  3. #   debug:顯示debug、info、error     
  4. #   info:顯示info、error     
  5.   
  6. #log4j.rootLogger=DEBUG,console,file  
  7. #子類重新定義日誌級別,logger的名字是日誌類的權限類名  
  8. #log4j.logger.org.linkinpark.commons.logtest.Log4jTest1=ERROR  
  9. #子類重新定義日誌級別,category的名字是日誌類的包名,可以將category理解爲Java的package。  
  10. #log4j.category.org.linkinpark.commons.logtest1=ERROR,file,rolling_file,daily_rolling_file  
  11. log4j.rootLogger=DEBUG,console,daily_rolling_file  
  12.   
  13. # 以下是rootLogger的配置,子類默認繼承,但是子類重寫下面配置=rootLogger+自己配置,我暈  
  14. #輸出到控制檯     
  15. log4j.appender.console=org.apache.log4j.ConsoleAppender    
  16. #設置輸出樣式     
  17. log4j.appender.console.layout=org.apache.log4j.PatternLayout   
  18. #日誌輸出信息格式爲  
  19. log4j.appender.console.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n   
  20. #DEBUG以上級別輸出,Threshold,入口,臨界值  
  21. #log4j.appender.console.Threshold=DEBUG  
  22. #日誌編碼方式  
  23. #log4j.appender.console.Encoding=UTF-8  
  24. #是否立即輸出  
  25. #log4j.appender.console.ImmediateFlush=true  
  26. #使用System.error作爲輸出  
  27. #log4j.appender.console.Target=System.error  
  28.   
  29. #輸出到文件(這裏默認爲追加方式)     
  30. log4j.appender.file=org.apache.log4j.FileAppender   
  31. #輸出文件位置  
  32. log4j.appender.file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/log4j.log  
  33. #是否在原日誌基礎上追加輸出日誌。true,默認,追加。false,清掉原來日誌重新添加  
  34. log4j.appender.file.Append=true  
  35. #樣式爲TTCCLayout     
  36. #log4j.appender.file.layout=org.apache.log4j.TTCCLayout  
  37. #樣式爲HTMLLayout  
  38. log4j.appender.file.layout=org.apache.log4j.HTMLLayout  
  39. log4j.appender.file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/log4j.html  
  40. #log4j.appender.file.layout=org.apache.log4j.PatternLayout  
  41. #log4j.appender.file.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n    
  42.   
  43. #按大小滾動文件(這裏默認爲追加方式)     
  44. log4j.appender.rolling_file=org.apache.log4j.RollingFileAppender   
  45. #輸出文件位置  
  46. log4j.appender.rolling_file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/rolling_log4j.log  
  47. log4j.appender.rolling_file.Append=true  
  48. #文件達到最大值自動更名  
  49. log4j.appender.rolling_file.MaxFileSize=1KB  
  50. #最多備份100個文件  
  51. log4j.appender.rolling_file.MaxBackupIndex=100  
  52. log4j.appender.rolling_file.layout=org.apache.log4j.PatternLayout  
  53. log4j.appender.rolling_file.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n  
  54.   
  55. #按日期滾動文件  
  56. log4j.appender.daily_rolling_file=org.apache.log4j.DailyRollingFileAppender   
  57. #輸出文件位置  
  58. log4j.appender.daily_rolling_file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/daily_rolling_log4j.log  
  59. #文件滾動日期格式  
  60. #每天:.YYYY-MM-dd(默認)  
  61. #每星期:.YYYY-ww  
  62. #每月:.YYYY-MM  
  63. #每隔半天:.YYYY-MM-dd-a  
  64. #每小時:.YYYY-MM-dd-HH  
  65. #每分鐘:.YYYY-MM-dd-HH-mm  
  66. #log4j.appender.daily_rolling_file.DatePattern=.yyyy-MM-dd  
  67. log4j.appender.daily_rolling_file.DatePattern=.YYYY-MM-dd-HH-mm  
  68. log4j.appender.daily_rolling_file.layout=org.apache.log4j.PatternLayout  
  69. log4j.appender.daily_rolling_file.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n  
  70.   
  71. #自定義樣式     
  72. #%c 輸出所屬的類目,通常就是所在類的全名   
  73. #%C 輸出Logger所在類的名稱,通常就是所在類的全名   
  74. #%d 輸出日誌時間點的日期或時間,默認格式爲ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS},%d{ABSOLUTE},%d{DATE}  
  75. #%F 輸出所在類的類名稱,只有類名。  
  76. #%l 輸出語句所在的行數,包括類名+方法名+文件名+行數  
  77. #%L 輸出語句所在的行數,只輸出數字  
  78. #%m 輸出代碼中指定的訊息,如log(message)中的message  
  79. #%M 輸出方法名  
  80. #%p 輸出日誌級別,即DEBUG,INFO,WARN,ERROR,FATAL  
  81. #%r 輸出自應用啓動到輸出該log信息耗費的毫秒數  
  82. #%t 輸出產生該日誌事件的線程名  
  83. #%n 輸出一個回車換行符,Windows平臺爲“/r/n”,Unix平臺爲“/n”  
  84. #%% 用來輸出百分號“%”  
  85. #log4j.appender.Linkin.layout.ConversionPattern=%n[%l%d{yy/MM/dd HH:mm:ss:SSS}][%C-%M] %m    
  86. #log4j.appender.Linkin.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}[%C]-[%p] %m%n     
  87. #log4j.appender.Linkin.layout.ConversionPattern = %d{ABSOLUTE} %5p %t %c{2}:%L - %m%n  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章