Log4J:Log4J三大組件:Logger+Appender+Layout 格式化編程詳解


快速了解Log4J

Log4J的三個組件:

Logger:日志記錄器,負責收集處理日志記錄     (如何處理日志)

Appender:日志輸出目的地,負責日志的輸出  (輸出到什么 地方)

Layout:日志格式化,負責對輸出的日志格式化(以什么形式展現)

類結構圖(來自http://www.blogjava.net/DLevin/archive/2012/06/28/381667.html

一個logger可以對應多個appender,一個appender只能對應一個layout。

1、Logger:

logger可以有選擇的啟動和禁用日志的輸出,我們經常會在各種框架中看到如:

  1. private static final Logger log = LoggerFactory.getLogger(XX.class);  

 log就代表了一個Logger實例,他的name就是類“XX”的full quailied name(類的全限定名),按照上圖所述,這個log就可以指定多個appender和layout。Logger的名字大小寫敏感,其命名有繼承機制:例如:name為org.apache.commons的logger會繼承name為org.apache的logger。

Log4J中有一個特殊的logger叫做“root”,他是所有logger的根,也就意味着其他所有的logger都會直接或者間接地繼承自root。root logger可以用Logger.getRootLogger()方法獲取,但是不能通過Logger.getLogger("root")獲得。可以代碼測試驗證:

  1. Logger root = Logger.getRootLogger();  
  2. Logger log  = Logger.getLogger("root");  
  3. System.out.println(log==root); //false  說明root無法通過name獲取  
  4.   
  5. Logger log2 = Logger.getLogger("root");  
  6. System.out.println(log==log2); //true,說明一個name唯一對應一個logger  

2、Level

level為logger服務,用來定義日志的級別,他的值可以是: OFF(關閉)FATAL(致命的) ERROR(錯誤)WARN(警告) INFO(信息)DEBUG (調試) ALL(所有),輸出日志的策略由此Level決定,例如:如果logger的Level設置為INFO,那么系統只輸出INFO以及以上(WARN、ERROR、FATAL)信息。如果當前logger沒有設定Level,那么它在輸出日志時采用的策略是:它會使用它繼承的Logger的Level作為它自己的Level來處理。如果它的上級也沒有設置Level,那么就找上上級,幾次類推,直到root為止,(root的Level是不能設為空的,所以最終一定會找到一個Level)。默認root的Level是INFO,其他logger的Level默認都是null,需要手動指定。

Level對應的logger輸出級別對應的方法有:

  1. logger.debug(message);   Log4J:Log4J三大組件:Logger+Appender+Layout 格式化編程詳解
  2. logger.info(message);  
  3. logger.warn(message);  
  4. logger.error(message);  
  5. logger.fatal(message);  

3、Appender:

Appender可以控制日志的輸出的目的地,一個輸出源就叫一個Appender,appender的類別有:Console(控制台)File(文件)JDBC、JMS等等,logger可以通過方法logger.addAppender(appender);配置多個appender,對logger來說,每個有效的日志請求結果都將輸出到logger本身以及父logger的appender上。例如:

  1.               Logger com = Logger.getLogger("com");  
  2. Appender appender = new FileAppender(new SimpleLayout(),"hello.log");  
  3. com.addAppender( appender);  
  4.   
  5.   
  6. Logger iteye = Logger.getLogger("com.iteye");  
  7. iteye.addAppender(new ConsoleAppender(new SimpleLayout(), "System.out"));  //target:sys.out(default) 或 sys.err  
  8. iteye.info("hello world");  

上例中,“iteye”是繼承“com ”logger的,"com"定義的appender是FileAppender,而"iteye"定義的appender是ConsoleAppender,這里我並沒有設置他們的Level,那么自動使用root默認的INFO作為日志的的等級,因此此處iteye.info(“hello world")會被輸出到指定的appender上。注意:這里"iteye" 並沒有設置FileAppender作為自己的appender,但是最終日志信息會顯示在控制台,而且也會輸出到文件hello.log中去。不過這里可以通過設置logger ”iteye"的additivity(附加標記)設為false ==》iteye.setAdditivity(false);這樣日志信息“hello world”就不會寫入到hello.log中去了。

常用的集中appender有:

org.apache.log4j.ConsoleAppender(控制台)

org.apache.log4j.FileAppender(文件)

org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件)

org.apache.log4j.RollingFileAppender((文件大小到達指定尺寸的時候產生一個新的文件)

org.apache.log4j.WriterAppender(將日志信息以流格式發送到任意指定的地方)

4、Layout:

使用指定的Layout來展示(格式化)日志,常見的Layout有:

org.apache.log4j.HTMLLayout(以HTML表格形式布局)

org.apache.log4j.PatternLayout(可以靈活地指定布局模式)

org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串)

org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等等信息),更多

 

5、配置:

理解了以上幾個組建后,我們就可以了解一下log4j的配置log4j.properties了。

  1.  #配置根Logger  
  2. log4j.rootLogger  =   [ level ]   ,  appenderName1 ,  appenderName2 ,  …  
  3.   
  4. #例子:  
  5. log4j.rootLogger = DEBUG ,  stdout ,file  
  6. #配置日志信息輸出目的地(Appender)  
  7.       log4j.appender.appenderName  =  fully.qualified.name.of.appender.class   
  8.   log4j.appender.appenderName.option1  =  value1   
  9.   …   
  10.   log4j.appender.appenderName.optionN  =  valueN   
  11.   
  12. #例子  
  13. ### 輸出到控制台 ###  
  14. log4j.appender.stdout = org.apache.log4j.ConsoleAppender  
  15. log4j.appender.stdout.Target = System.out   #默認就是System.out,另外一個值是System.error  
  16. log4j.appender.stdout.layout = org.apache.log4j.PatternLayout  
  17. log4j.appender.stdout.layout.ConversionPattern =  %d{ABSOLUTE} %5p %c{ 1 }:%L - %m%n  
  18.   
  19. ### 輸出到文件 ###  
  20. log4j.appender.file = org.apache.log4j.DailyRollingFileAppender  
  21. log4j.appender.file.File = logs/log.log  
  22. log4j.appender.file.Append = true   #默認就是true,系統啟動時追加至文件中,否則會覆蓋原有內容  
  23. log4j.appender.file.Threshold = INFO ## 輸出IFNO級別以上的日志,這里的意思是rootLogger設置為DEBUG時,只輸出INFO以上(INFO、WARN、ERROR、FATAL)的信息到文件中去,而DEBUG信息就不會輸出了  
  24. log4j.appender.file.layout = org.apache.log4j.PatternLayout  
  25. log4j.appender.file.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n  
  26. #配置日志信息的格式(Layout)  
  27. log4j.appender.appenderName.layout  =  fully.qualified.name.of.layout.class   
  28. log4j.appender.appenderName.layout.option1  =  value1   
  29. …   
  30. log4j.appender.appenderName.layout.optionN  =  valueN   
  31.   
  32. #例子  
  33. log4j.appender.file.layout = org.apache.log4j.PatternLayout  
  34. log4j.appender.file.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n  
  35.   
  36. ConversionPattern參數的格式含義   
  37. 格式名   含義   
  38. %c         輸出日志信息所屬的類的全名   
  39. %d         輸出日志時間點的日期或時間,默認格式為ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd HH:mm:ss },輸出類似:2002-10-18- 22:10:28   
  40. %f          輸出日志信息所屬的類的類名   
  41. %l          輸出日志事件的發生位置,即輸出日志信息的語句處於它所在的類的第幾行   
  42. %m        輸出代碼中指定的信息,如log(message)中的message   
  43. %n         輸出一個回車換行符,Windows平台為“rn”,Unix平台為“n”   
  44. %p         輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL。如果是調用debug()輸出的,則為DEBUG,依此類推   
  45. %r          輸出自應用啟動到輸出該日志信息所耗費的毫秒數   
  46. %t          輸出產生該日志事件的線程名  

最后如果你看到此類錯誤應該有不再感到疑惑了吧:

  1. public static org.slf4j.Logger log = LoggerFactory.getLogger(Test.class);  
  2. log.error("erro");  

 log4j:WARN No appenders could be found for logger (Test).

 log4j:WARN Please initialize the log4j system properly. 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM