a). 兩種配置方式,log4j.xml和log4j.properties b). 由3個東西組成, "logger"--負責採集日誌,程序中使用,有繼承關係 "appender"--負責日誌輸出到哪裏,控制檯或文件 "layout"--定義日誌輸出的格式
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
a). 日誌信息傳入 Logger. b). 將日誌信息封裝成 LoggingEvent 對象並傳入 Appender. c). 在 Appender 中調用 Filter 對日誌信息進行過濾,調用 Layout 對日誌信息進行格式化,而後輸出. d). Logger Logger = LogManager.getLogger("categorylog"); (<category標籤的name屬性>) --> category --> Appender
public class Ts { // 按字符串匹配category,無則匹配到root, 支持按package層級匹配 Logger Logger = LogManager.getLogger(Ts.class); @Test public void test() throws InterruptedException { while (true) { Logger.debug("This is debug .."); Logger.info("This is info .."); Logger.error("This is error ..\n\n"); Thread.sleep(2000); // log4j.xml動態修改 DOMConfigurator.configure(Ts.class.getResource("/log4j.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="CONSOLE" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> </layout> </appender> <appender name="FILE-DEBUG" class="org.apache.log4j.DailyRollingFileAppender"> <param name="DatePattern" value="'.'yyyyMMdd" /> <param name="Append" value="true"/> <param name="Threshold" value="DEBUG"/> <param name="Encoding" value="UTF-8"/> <param name="file" value="./debug.log"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{HH:mm:ss}] [%p] - %l - %m%n"/> </layout> </appender> <!-- 支持按包過濾,也能夠直接是字符串 --> <category name="zhou.test"> <priority value="ERROR"/> <appender-ref ref="CONSOLE"/> <appender-ref ref="FILE-DEBUG"/> </category> </log4j:configuration>
內置 appender : 1).ConsoleAppender (控制檯), 2).FileAppender (文件), 3).DailyRollingFileAppender (天天產生一個日誌文件), 4).RollingFileAppender (文件大小到達指定尺寸的時候產生一個 新的文件) 5).WriterAppender (將日誌信息以流格式發送到任意指定的地方)
<appender name="FILE" class="org.jboss.logging.appender.DailyRollingFileAppender"> <param name="File" value="${jboss.server.home.dir}/log/server.log"/> <!-- 設置是否在從新啓動服務時,在原有日誌的基礎添加新日誌 --> <param name="Append" value="false"/> <!-- Rollover at midnight each day --> <param name="DatePattern" value="'.'yyyy-MM-dd"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/> </layout> </appender>
<appender name="SYSTEM_RUN_FILE" class="com.huawei.mdn.cms.log.CMSAppender"> <param name="File" value="../logs/run/CMI_system_run" /> <param name="MaxFileSize" value="&runLogSize;" /> <param name="MaxBackupIndex" value="20" /> <param name="Append" value="true" /> <layout class="com.huawei.mdn.cms.log.MdnSystemRunLogLayout"/> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="INFO"/> <param name="LevelMax" value="FATAL"/> </filter> </appender>
<!--過濾器設置輸出的級別--> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="levelMin" value="debug" /> <param name="levelMax" value="warn" /> <param name="AcceptOnMatch" value="true" /> </filter>
繼承AppenderSkeleton類-->[通常]實現Append方法便可
//內置layout HTMLLayout(以HTML表格形式佈局), PatternLayout(可自定義佈局和輸出內容)-- 經常使用 SimpleLayout(包含日誌信息的級別和信息字符串), TTCCLayout(包含日誌產生的時間、線程、類別等等信息) Log4J採用相似C的printf函數的格式化日誌,打印參數以下: -- 經常使用 「[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n」 %p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL %l 輸出日誌事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。舉例:com.Testlog4.main(TestLog4.java:10) %d 輸出日誌時間點的日期或時間,默認格式爲ISO8601,也能夠在其後指定格式,好比:%d{yyy MMM dd HH:mm:ss,SSS},輸出相似:2002年10月18日 22:10:28,921 %n 輸出一個回車換行符,Windows平臺爲「rn」,Unix平臺爲「n」 %m 輸出代碼中指定的消息 %x %t 輸出產生該日誌事件的線程名 %r 輸出自應用啓動到輸出該log信息耗費的毫秒數 %c 輸出所屬的類目,一般就是所在類的全名 %M 調用logger的方法名。
<layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/> </layout> </appender>
繼承 TTCCLayout等內置的layout,或是layout接口-->實現format方法便可
public class MdnDebugLogLayout extends TTCCLayout { private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS"; public MdnDebugLogLayout() { } @SuppressWarnings("unchecked") public String format(LoggingEvent event) { LocationInfo locationInfo = event.getLocationInformation(); String lineNumber = locationInfo.getLineNumber(); String fileName = locationInfo.getFileName(); String threadName = event.getThreadName(); String message = event.getRenderedMessage(); setDateFormat(DATE_FORMAT); buf.setLength(0); buf.append("["); buf.append(threadName); return buf.toString(); } }
//Logger Logger = LogManager.getLogger("categorylog"); (<category標籤的name屬性>) --> category --> Appender <appender name="FILE-DEBUG" class="org.apache.log4j.DailyRollingFileAppender"> <param name="DatePattern" value="'.'yyyyMMdd" /> <param name="Append" value="true"/> <param name="Threshold" value="DEBUG"/> <param name="Encoding" value="UTF-8"/> <param name="file" value="${profile.log.root.path}/${profile.log.name.web}/${profile.log.name.web}-debug.log"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%7r] %-5p %c %M:%L - %m%n"/> </layout> </appender> <!-- 日誌過濾,只打印 com.portal.controller路徑下日誌 --> <category name="com.portal.controller"> <priority value="INFO"/> <appender-ref ref="CONSOLE"/> </category> <root> <priority value="INFO"/> <appender-ref ref="CONSOLE"/> <appender-ref ref="FILE-DEBUG"/> </root> </log4j:configuration>