轉載請註明文章出處: https://tlanyan.me/log4j-conf...
log4j是阿帕奇日誌服務(Apache Logging Services)旗下的一款強大的開源日誌輸出工具。log4j使用上簡潔便利,高效且拓展性強,幾乎是Java編程的必備依賴包。除Java專用的log4j,阿帕奇日誌服務網站還有log4net、log4php等其餘編程語言對應的包。php
項目使用log4j做爲日誌組件,出於細分日誌的需求,要對配置文件作較大變更。以前對一些概念理解不是很到位,趁此機會抽空回顧官方的教程,收穫很多。因項目使用的1.2系列的jar包,本文整理自1.2版本的官方文檔。html
先回顧log4j中的三個重要概念:logger、appender和layout。三者協力決定日誌是否應該輸出、輸出到哪裏、輸出格式是什麼。數據庫
logger是輸出日誌的對象實例。除根logger外,其他均是命名logger,一般以調用的類名爲其名字。名字中的點(.)是log4j劃分層級的依據(與包package的組織方式相同),例如名字爲com.tlanyan
的logger是com.tlanyan.service
的logger的父級。apache
根logger是logger中的特殊存在,緣由有三:編程
Logger.getRootLogger
獲取。信息分爲六種等級:trace、debug、info、warn、error和fatal,分別對應Logger類的六個打印方法。等級之間有大小關係,trace等級最低,fatal最高。api
理解logger的層級和繼承是正確使用log4j的關鍵,即log4j不能肯定某個值時,默認會向上回溯直到找到根logger。例如根logger的appender默認老是被子logger繼承,會致使子logger中的信息屢次輸出,冗餘又低效;子級的level繼承自父級,低於父級的信息會被無心間過濾,等等。app
appender是日誌輸出的目的地,每一個appender是實現了Appender
接口的類具現化實例。經常使用的appender類有:編程語言
除了配置常規屬性值,appender中一個重要的特性是過濾器(filter)。過濾器對到達appender的信息作進一步過濾,最終肯定是否輸出。經常使用的過濾器有LevelRangeFilter
和StringMatchFilter
。函數
layout(佈局)隸屬於appender,對信息進行輸出前的格式化。例如增長打印時間,調用的文件名、線程等,或者按照xml格式輸出日誌。最經常使用的佈局是PatternLayout
,可配置的成員變量是ConversionPattern
,格式與C語言中的printf函數相同,具體含義請參考官方文檔。工具
配置log4j的方式主要有三種:1. 經過程序代碼;2. 鍵值對形式的properties配置文件;3. xml配置文件。後二者簡單易懂,且支持修改文件後配置即時生效,建議採用。
layout在appender中配置,因此配置文件主要由兩部分組成:logger和appender。xml文件格式良好,層級關係更明顯,相對properties文件本人更偏心xml格式。下面是log4j的一個簡單xml配置文件:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> <appender name="INFO" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="./logs/app-info.log"/> <param name="Append" value="true"/> <param name="MaxFileSize" value="50MB"/> <param name="MaxBackupIndex" value="10"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%-5r][%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l %m%n"/> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="INFO"/> <param name="LevelMax" value="INFO"/> </filter> </appender> <appender name="pay" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="./logs/pay-data.log"/> <param name="DatePattern" value="'.'yyyy-MM-dd"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%-5r][%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l %m%n"/> </layout> </appender> <appender name="ERROR" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="./logs/app-error.log"/> <param name="Append" value="true"/> <param name="MaxFileSize" value="50MB" /> <param name="MaxBackupIndex" value="20" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%-5r][%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l %m%n"/> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="WARN"/> <param name="LevelMax" value="ERROR"/> </filter> </appender> <logger name="com.tlanyan.pay" additivity="false"> <level value="info"/> <appender-ref ref="pay"/> </logger> <root> <level value="info"/> <appender-ref ref="INFO"/> <appender-ref ref="ERROR"/> </root> </log4j:configuration>
配置文件定義了三個appender,兩個logger。注意根logger沒有名字,要用root來引用。名字爲pay的logger不繼承父級(additivity="false"
),因此其中的信息不會輸出到app-info.log中。
建議在程序入口配置log4j並監聽配置文件:
DOMConfigurator.configureAndWatch("config/log4j.xml", 10000L);
經過監聽文件變化,可實現配置在修改後即時生效,無需改動代碼,也無需重啓程序。