大多數講log4j配置的教程用的都是log4j.properties文件,我以爲xml或許更好一點,在這裏我提供一個我已經用於生產環境的log4j.xml的例子,先上代碼,而後再解釋:java
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd"> <log4j:configuration> <!--輸出到控制檯--> <appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender"> <param name="Threshold" value="DEBUG"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> </layout> </appender> <!--輸出到文件(info)--> <!--將生成「info.log.2014-06-11」這樣的日誌文件--> <appender name="fileAppenderInfo" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="${user.home}/logs/website/info.log" /> <param name="DatePattern" value=".yyyy-MM-dd" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="INFO" /> <param name="LevelMax" value="INFO" /> </filter> </appender> <!--輸出到文件(warn)--> <appender name="fileAppenderWarn" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="${user.home}/logs/website/warn.log" /> <param name="DatePattern" value=".yyyy-MM-dd" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="WARN" /> <param name="LevelMax" value="WARN" /> </filter> </appender> <!--輸出到文件(error)--> <appender name="fileAppenderError" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="${user.home}/logs/website/error.log" /> <param name="DatePattern" value=".yyyy-MM-dd" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="ERROR" /> <param name="LevelMax" value="ERROR" /> </filter> </appender> <!--屏蔽全部org.springframework.*輸出的Debug(及如下)信息--> <logger name="org.springframework"> <level value="INFO"></level> </logger> <root> <level value="ALL"/> <appender-ref ref="consoleAppender" /> <appender-ref ref="fileAppenderInfo" /> <appender-ref ref="fileAppenderWarn" /> <appender-ref ref="fileAppenderError" /> </root> </log4j:configuration>
log4j簡單地說,由3個東西組成:web
你能夠定義一個layout,給一些appender使用,再定義幾個logger,使用不一樣的appender,總之很靈活,而我用的功能則很簡單:spring
我針對info,warning,error定義了3個appender,這3個appender的類型都是「DailyRollingFileAppender」,是log4j直接提供的,可以按天新建日誌文件,這些日誌文件的存放位置在用戶的home目錄的log/website子目錄下,爲何不存在程序當前的目錄?由於程序我常常要更新,一不當心就把log目錄刪掉了,固然你也能夠存到別的地方去,好比上級目錄,前提是要有寫入權限。另外還有一個appender是用於輸出到控制檯的,類型是「ConsoleAppender」,此類型也是log4j提供的。一共4個appender。apache
個人layout使用了「PatternLayout」,也是log4j提供的,這種layout能夠本身定義一個輸出模板,個人輸出模板是「[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n」,會生成這樣的輸出格式:app
[15:22:15:131] [DEBUG] - com.ignet.website.ui.controller.HomeController.exceptionTest(HomeController.java:19) - test output format [15:22:15:140] [ERROR] - com.ignet.website.ui.resolver.SimpleLoggingExceptionResolver.resolveException(SimpleLoggingExceptionResolver.java:26) - 未考慮到的異常發生,請注意排查
對通常的項目來講,足夠了。須要更豐富的信息的話就本身寫在日誌內容裏吧。框架
而對於logger,我只定義了兩個,一個是root,這個是全部logger的「祖先」,這個logger包含了前面定義的4個appender,這意味則什麼呢?意味着全部的日誌,都會嘗試調用這4個appender去記錄。那問題來了,假如我一個要log一個warning信息,那麼豈不是3個日誌文件中都有這個信息?——放心,仔細看,我在appender中設置了過濾,看一看你就明白了。ui
一切安好,除了運行時候發覺spring框架輸出的廢話實在太多,那些debug信息對咱們來講沒什麼用,咱們又不打算修改spring的代碼,因而我定義了另外一個logger,名字叫「org.springframework」,全部「org.springframework」命名空間下的類,都會使用這個logger,我給這個logger設置了一個level,爲info,debug比info低,因此今後之後spring的那些debug信息就不來煩我了。「org.springframework」這個logger是root logger的孩子,因此理所固然地「繼承了」4個appender,不須要再寫了吧?spa
這裏稍微提一下,爲啥spring框架這麼聰明,會自動使用咱們另外加上去的log4j?其實spring是用了一個叫「commons-logging」的庫,這玩意兒能自動檢測各大logging framework並使用,很牛逼就是。
debug
最後生成的日誌文件大體是這樣的,你們感覺下:日誌
error.log error.log.2014-08-13 info.log.2014-07-23 info.log.2014-08-04 info.log.2014-08-14 error.log.2014-07-11 info.log info.log.2014-07-24 info.log.2014-08-05 info.log.2014-08-15 error.log.2014-07-18 info.log.2014-07-11 info.log.2014-07-25 info.log.2014-08-06 info.log.2014-08-19 error.log.2014-07-22 info.log.2014-07-17 info.log.2014-07-28 info.log.2014-08-07 info.log.2014-08-20 error.log.2014-08-04 info.log.2014-07-18 info.log.2014-07-29 info.log.2014-08-08 info.log.2014-08-21 error.log.2014-08-05 info.log.2014-07-19 info.log.2014-07-30 info.log.2014-08-09 info.log.2014-08-22 error.log.2014-08-07 info.log.2014-07-21 info.log.2014-07-31 info.log.2014-08-11 warn.log error.log.2014-08-11 info.log.2014-07-22 info.log.2014-08-01 info.log.2014-08-13 warn.log.2014-07-11
日積月累,日誌文件愈來愈多,咋辦?教你們個祕籍,在這個日誌目錄的上兩層目錄寫個腳本:
find ./logs/website -ctime +10 -exec rm {} \;
執行這個腳本,就能刪除掉10天之前的過時日誌。