1. 程式人生 > >關於log4j配置問題(轉)

關於log4j配置問題(轉)

本文轉自http://blog.csdn.net/hongweigg/article/details/7085895

1、想輸出多個檔案,不想所有的日誌都輸出在一個檔案裡。比如已有一個根logger,能記錄所有的日誌,但希望對某個類中(某部分或全部)的日誌單獨輸出到一個檔案中,怎麼辦?

解決辦法:增加一個logger, 如希望一個叫Swift的類,裡面有些日誌希望單獨輸出,則可以增加一個logger記錄器,名為SWIFT,日誌輸出級別為DEBUG。

  1. log4j.logger.SWIFT=DEBUG,SWIFT  
  2. log4j.appender.SWIFT=org.apache.log4j.DailyRollingFileAppender  
  3. log4j.appender.SWIFT.File=C:/Logs/SWIFT.log  
  4. log4j.appender.SWIFT.DatePattern='.'yyyy-MM-dd  
  5. log4j.appender.SWIFT.layout=org.apache.log4j.PatternLayout  
  6. log4j.appender.SWIFT.layout.ConversionPattern=[%d] %t %1p %18c{3}(%L):%m %n  

與根logger的比較

  1. log4j.rootLogger=DEBUG,D  
  2. log4j.appender.D=org.apache.log4j.DailyRollingFileAppender  
  3. log4j.appender.D.File=C:/Logs/DEBUG.log  
  4. log4j.appender.D.DatePattern='.'yyyy-MM-dd  
  5. log4j.appender.D.ImmediateFlush=true  
  6. log4j.appender.D.Threshold=DEBUG  
  7. log4j.appender.D.layout=org.apache.log4j.PatternLayout  
  8. log4j.appender.D.layout.ConversionPattern=[%d] %1p %18c{3}(%L):%m %n  

2、如果1中的日誌輸出太多,不想重複輸出到DEBUG.log檔案中怎麼辦?

解決:使用additivity屬性,將其屬性設定為false,則Swift類中的日誌不會再輸出到DEBUG.log檔案中

  1. log4j.logger.SWIFT=DEBUG,SWIFT  
  2. log4j.appender.SWIFT=org.apache.log4j.DailyRollingFileAppender  
  3. <span style="font-weight: bold;">log4j.additivity.SWIFT=false</span>  
  4. log4j.appender.SWIFT.File=C:/Logs/SWIFT.log  
  5. log4j.appender.SWIFT.DatePattern='.'yyyy-MM-dd  
  6. log4j.appender.SWIFT.layout=org.apache.log4j.PatternLayout  
  7. log4j.appender.SWIFT.layout.ConversionPattern=[%d] %t %1p %18c{3}(%L):%m %n  

3、看日誌的時候,若用ECLIPSE類的開發工具,則發現日誌只能到日誌檔案中看,在開發環境中看不到

解決:只要設定日誌輸出到控制檯即可

  1. log4j.rootLogger=DEBUG,stdout  
  2. log4j.appender.stdout = org.apache.log4j.ConsoleAppender  
  3. log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
  4. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
  5. log4j.appender.stdout.layout.ConversionPattern=[%t] %-5p %-20c{2}(%L): - %m %n   

4、一個類中,想要一些日誌輸出到總日誌檔案(如DEBUG.log)中,一些日誌輸出到另外的日誌檔案中,怎麼辦?

解決:log4j配置參考1的配置。類中設定兩個或多個logger,想要輸出到哪裡就輸出到哪裡。

  1. publicclass Swift extends HttpServlet {  
  2.     static Logger logger = Logger.getLogger(SwiftSys.class);  
  3.     static Logger log = Logger.getLogger("SWIFT");  
  4.     publicvoid doPost(HttpServletRequest req, HttpServletResponse resp)  
  5.             throws ServletException, IOException {  
  6.           logger.debug("輸出到總的DEBUG.log檔案");  
  7.           log.debug("開小灶,這個日誌輸出到SWIFT.log中");  
  8.     }  

5、如果想對日誌分級怎麼辦,如錯誤日誌輸出到DEBUG.log檔案中,錯誤日誌輸出到ERROR.log檔案中

解決:使用Threshold屬性,若輸出到DEBUG.log檔案中,則屬性為DEBUG;若輸出到ERROR.log檔案中,則屬性為ERROR。

下面的例子中logger D為輸出DEBUG級別的日誌,logger E為輸出ERROR級別的日誌。

  1. log4j.rootLogger=DEBUG,D,E  
  2. log4j.appender.D=org.apache.log4j.DailyRollingFileAppender  
  3. log4j.appender.D.File=C:/Logs/DEBUG.log  
  4. log4j.appender.D.DatePattern='.'yyyy-MM-dd  
  5. log4j.appender.D.ImmediateFlush=true  
  6. log4j.appender.D.Threshold=DEBUG  
  7. log4j.appender.D.layout=org.apache.log4j.PatternLayout  
  8. log4j.appender.D.layout.ConversionPattern=[%d] %1p %18c{3}(%L):%m %n  
  9. log4j.appender.E=org.apache.log4j.DailyRollingFileAppender  
  10. log4j.appender.E.File=C:/Logs/ERROR.log  
  11. log4j.appender.E.DatePattern='.'yyyy-MM-dd  
  12. log4j.appender.E.ImmediateFlush=true  
  13. log4j.appender.E.Threshold=ERROR  
  14. log4j.appender.E.layout=org.apache.log4j.PatternLayout  
  15. log4j.appender.E.layout.ConversionPattern=[%d] %t %5p %18c{3}(%L):%m %n  

總結:

一個完整的log4j的配置

  1. log4j.rootLogger=DEBUG,D,E  
  2. log4j.appender.stdout = org.apache.log4j.ConsoleAppender  
  3. log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
  4. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
  5. log4j.appender.stdout.layout.ConversionPattern=[%t] %-5p %-20c{2}(%L): - %m %n   
  6. log4j.appender.D=org.apache.log4j.DailyRollingFileAppender  
  7. log4j.appender.D.File=C:/Logs/DEBUG.log  
  8. log4j.appender.D.DatePattern='.'yyyy-MM-dd  
  9. log4j.appender.D.ImmediateFlush=true  
  10. log4j.appender.D.Threshold=DEBUG  
  11. log4j.appender.D.layout=org.apache.log4j.PatternLayout  
  12. log4j.appender.D.layout.ConversionPattern=[%d] %1p %18c{3}(%L):%m %n  
  13. log4j.appender.E=org.apache.log4j.DailyRollingFileAppender  
  14. log4j.appender.E.File=C:/Logs/ERROR.log  
  15. log4j.appender.E.DatePattern='.'yyyy-MM-dd  
  16. log4j.appender.E.ImmediateFlush=true  
  17. log4j.appender.E.Threshold=ERROR  
  18. log4j.appender.E.layout=org.apache.log4j.PatternLayout  
  19. log4j.appender.E.layout.ConversionPattern=[%d] %t %5p %18c{3}(%L):%m %n  
  20. log4j.appender.SWIFT=org.apache.log4j.DailyRollingFileAppender  
  21. log4j.additivity.SWIFT=false  
  22. log4j.appender.SWIFT.File=C:/Logs/SWIFT.log  
  23. log4j.appender.SWIFT.DatePattern='.'yyyy-MM-dd  
  24. log4j.appender.SWIFT.ImmediateFlush=true  
  25. log4j.appender.SWIFT.Threshold=DEBUG  
  26. log4j.appender.SWIFT.layout=org.apache.log4j.PatternLayout  
  27. log4j.appender.SWIFT.layout.ConversionPattern=[%d] %t %1p %18c{3}(%L):%m %n  

日誌常用的兩種的形式:

1、日期輪迴,一天可以輸出一個,一個小時輸出一個,或一週輸出一個等,具體的可以查閱相關資料,不再贅述。

  1. DailyRollingFileAppender  
2、大小輪迴,設定每個日誌檔案最大SIZE,總共多少個日誌檔案,若所有日誌都寫滿,則最後的部分被擠出丟失。
  1. RollingFileAppender  

當然還有可以輸出到檔案,輸出到資料表,或者輸出到流等。

日誌格式的幾點說明:

%d 日期

%t 執行執行緒

%p 日誌級別 如DEBUG, INFO, ERROR, FETAL

%c  所在類得包名,例: %18c{3}  18為固定寬度,不夠留空,超過則按實際長度輸出;3為包的層次,從當前類往上推

%L 日誌輸出程式碼所在行號

%m 日誌內容

%n 換行符

高階的內容還有根據不同的使用者標識來進行輸出,每個使用者都有對應的日誌,因比較複雜,在此不作闡述。