關於log4j配置問題(轉)
本文轉自http://blog.csdn.net/hongweigg/article/details/7085895
1、想輸出多個檔案,不想所有的日誌都輸出在一個檔案裡。比如已有一個根logger,能記錄所有的日誌,但希望對某個類中(某部分或全部)的日誌單獨輸出到一個檔案中,怎麼辦?
解決辦法:增加一個logger, 如希望一個叫Swift的類,裡面有些日誌希望單獨輸出,則可以增加一個logger記錄器,名為SWIFT,日誌輸出級別為DEBUG。
- log4j.logger.SWIFT=DEBUG,SWIFT
-
log4j.appender.SWIFT=org.apache.log4j.DailyRollingFileAppender
- log4j.appender.SWIFT.File=C:/Logs/SWIFT.log
- log4j.appender.SWIFT.DatePattern='.'yyyy-MM-dd
- log4j.appender.SWIFT.layout=org.apache.log4j.PatternLayout
- log4j.appender.SWIFT.layout.ConversionPattern=[%d] %t %1p %18c{3}(%L):%m %n
與根logger的比較
- log4j.rootLogger=DEBUG,D
-
log4j.appender.D=org.apache.log4j.DailyRollingFileAppender
- log4j.appender.D.File=C:/Logs/DEBUG.log
- log4j.appender.D.DatePattern='.'yyyy-MM-dd
- log4j.appender.D.ImmediateFlush=true
- log4j.appender.D.Threshold=DEBUG
- log4j.appender.D.layout=org.apache.log4j.PatternLayout
- log4j.appender.D.layout.ConversionPattern=[%d] %1p %18c{3}(%L):%m %n
2、如果1中的日誌輸出太多,不想重複輸出到DEBUG.log檔案中怎麼辦?
解決:使用additivity屬性,將其屬性設定為false,則Swift類中的日誌不會再輸出到DEBUG.log檔案中
- log4j.logger.SWIFT=DEBUG,SWIFT
- log4j.appender.SWIFT=org.apache.log4j.DailyRollingFileAppender
- <span style="font-weight: bold;">log4j.additivity.SWIFT=false</span>
- log4j.appender.SWIFT.File=C:/Logs/SWIFT.log
- log4j.appender.SWIFT.DatePattern='.'yyyy-MM-dd
- log4j.appender.SWIFT.layout=org.apache.log4j.PatternLayout
- log4j.appender.SWIFT.layout.ConversionPattern=[%d] %t %1p %18c{3}(%L):%m %n
3、看日誌的時候,若用ECLIPSE類的開發工具,則發現日誌只能到日誌檔案中看,在開發環境中看不到
解決:只要設定日誌輸出到控制檯即可
- log4j.rootLogger=DEBUG,stdout
- log4j.appender.stdout = org.apache.log4j.ConsoleAppender
- log4j.appender.stdout=org.apache.log4j.ConsoleAppender
- log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
- log4j.appender.stdout.layout.ConversionPattern=[%t] %-5p %-20c{2}(%L): - %m %n
4、一個類中,想要一些日誌輸出到總日誌檔案(如DEBUG.log)中,一些日誌輸出到另外的日誌檔案中,怎麼辦?
解決:log4j配置參考1的配置。類中設定兩個或多個logger,想要輸出到哪裡就輸出到哪裡。
- publicclass Swift extends HttpServlet {
- static Logger logger = Logger.getLogger(SwiftSys.class);
- static Logger log = Logger.getLogger("SWIFT");
- publicvoid doPost(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- logger.debug("輸出到總的DEBUG.log檔案");
- log.debug("開小灶,這個日誌輸出到SWIFT.log中");
- }
5、如果想對日誌分級怎麼辦,如錯誤日誌輸出到DEBUG.log檔案中,錯誤日誌輸出到ERROR.log檔案中
解決:使用Threshold屬性,若輸出到DEBUG.log檔案中,則屬性為DEBUG;若輸出到ERROR.log檔案中,則屬性為ERROR。
下面的例子中logger D為輸出DEBUG級別的日誌,logger E為輸出ERROR級別的日誌。
- log4j.rootLogger=DEBUG,D,E
- log4j.appender.D=org.apache.log4j.DailyRollingFileAppender
- log4j.appender.D.File=C:/Logs/DEBUG.log
- log4j.appender.D.DatePattern='.'yyyy-MM-dd
- log4j.appender.D.ImmediateFlush=true
- log4j.appender.D.Threshold=DEBUG
- log4j.appender.D.layout=org.apache.log4j.PatternLayout
- log4j.appender.D.layout.ConversionPattern=[%d] %1p %18c{3}(%L):%m %n
- log4j.appender.E=org.apache.log4j.DailyRollingFileAppender
- log4j.appender.E.File=C:/Logs/ERROR.log
- log4j.appender.E.DatePattern='.'yyyy-MM-dd
- log4j.appender.E.ImmediateFlush=true
- log4j.appender.E.Threshold=ERROR
- log4j.appender.E.layout=org.apache.log4j.PatternLayout
- log4j.appender.E.layout.ConversionPattern=[%d] %t %5p %18c{3}(%L):%m %n
總結:
一個完整的log4j的配置
- log4j.rootLogger=DEBUG,D,E
- log4j.appender.stdout = org.apache.log4j.ConsoleAppender
- log4j.appender.stdout=org.apache.log4j.ConsoleAppender
- log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
- log4j.appender.stdout.layout.ConversionPattern=[%t] %-5p %-20c{2}(%L): - %m %n
- log4j.appender.D=org.apache.log4j.DailyRollingFileAppender
- log4j.appender.D.File=C:/Logs/DEBUG.log
- log4j.appender.D.DatePattern='.'yyyy-MM-dd
- log4j.appender.D.ImmediateFlush=true
- log4j.appender.D.Threshold=DEBUG
- log4j.appender.D.layout=org.apache.log4j.PatternLayout
- log4j.appender.D.layout.ConversionPattern=[%d] %1p %18c{3}(%L):%m %n
- log4j.appender.E=org.apache.log4j.DailyRollingFileAppender
- log4j.appender.E.File=C:/Logs/ERROR.log
- log4j.appender.E.DatePattern='.'yyyy-MM-dd
- log4j.appender.E.ImmediateFlush=true
- log4j.appender.E.Threshold=ERROR
- log4j.appender.E.layout=org.apache.log4j.PatternLayout
- log4j.appender.E.layout.ConversionPattern=[%d] %t %5p %18c{3}(%L):%m %n
- log4j.appender.SWIFT=org.apache.log4j.DailyRollingFileAppender
- log4j.additivity.SWIFT=false
- log4j.appender.SWIFT.File=C:/Logs/SWIFT.log
- log4j.appender.SWIFT.DatePattern='.'yyyy-MM-dd
- log4j.appender.SWIFT.ImmediateFlush=true
- log4j.appender.SWIFT.Threshold=DEBUG
- log4j.appender.SWIFT.layout=org.apache.log4j.PatternLayout
- log4j.appender.SWIFT.layout.ConversionPattern=[%d] %t %1p %18c{3}(%L):%m %n
日誌常用的兩種的形式:
1、日期輪迴,一天可以輸出一個,一個小時輸出一個,或一週輸出一個等,具體的可以查閱相關資料,不再贅述。
- DailyRollingFileAppender
- RollingFileAppender
當然還有可以輸出到檔案,輸出到資料表,或者輸出到流等。
日誌格式的幾點說明:
%d 日期
%t 執行執行緒
%p 日誌級別 如DEBUG, INFO, ERROR, FETAL
%c 所在類得包名,例: %18c{3} 18為固定寬度,不夠留空,超過則按實際長度輸出;3為包的層次,從當前類往上推
%L 日誌輸出程式碼所在行號
%m 日誌內容
%n 換行符
高階的內容還有根據不同的使用者標識來進行輸出,每個使用者都有對應的日誌,因比較複雜,在此不作闡述。