log4j2筆記 #04# Appender的三個基本款以及RollingFile的各種示例配置
阿新 • • 發佈:2018-11-28
粗糙筆記,留著備用。
三個基本款分別是ConsoleAppender、FileAppender(以及他的堂哥RandomAccessFileAppender)、RollingFileAppender(以及他的堂哥llingRandomAccessFileAppender),其中RollingFileAppender是三個appender中的大哥大,因為他一個人的文件篇幅就是其它兩個appender文件篇幅總和的6~7倍左右。。。
關於三個appender的簡單介紹:
<?xml version="1.0" encoding="UTF-8"?> <Configurationstatus="WARN"> <!-- 在Appenders中定義可選的輸出“目的地” --> <Appenders> <!-- Appenders官方文件地址https://logging.apach e.org/log4j/2.x/manual/appenders.html,其次是可 以直接去看org.apache.logging.log4j.core.appender 包下的appender原始碼 --> <Console name="STDOUT"target="SYSTEM_OUT"> <!-- 在pattern中定義輸出格式,各種佔位符(轉 義符)的用法、含義可查詢文件https://logging.a pache.org/log4j/2.x/manual/layouts.html --> <PatternLayout pattern="%m%n"/> <!-- 對於ConsoleAppender而言,Layout是必要的, 預設就是%m%n --></Console> <!-- FileAppender。servlet容器中的兩個web應用程式 可以擁有它們各自的配置,如果Log4j位於它們共同使用 的類載入器中,則可以安全地將日誌寫入同一個檔案。預設 啟用bufferedIO以及immediateFlush(前者提高效能,後 者可以保證寫入,緩衝區沒滿也寫入!每次寫操作都會調 用flush,不過有點影響效能),如果是非同步Logger,即便 immediateFlush設定為false,非同步Logger和appender也 將在一批事件結束時自動flush,這樣做比較高效同時 保證了資料寫入磁碟 --> <File name="MyFile" fileName="logs/app.log"> <PatternLayout pattern="%m%n"/> </File> <!-- 似乎可以看作是FileAppender的進化版,實現上不大 一樣,根據報導,相比啟用了bufferedIO的FileAppender 效能提高了20-200%(RandomAccessFile沒有bufferedIO 這個選項,因為它總是buffered的!) --> <RandomAccessFile name="MyRandomAccessFile" fileName="logs/app.log"> <PatternLayout> <Pattern>%d %p %c{1.} [%t] %m%n</Pattern> </PatternLayout> </RandomAccessFile> <!--RollingFileAppender是一個OutputStreamAppender, 它寫入fileName引數中指定的檔案,並根據TriggeringPolicy 和RolloverPolicy將檔案翻轉。對於RollingFileAppender而 言,這兩個Policy都是必要的,TriggeringPolicy確定是否應 該執行滾動,而RolloverStrategy定義如何執行滾動。--> <RollingFile name="RollingFileInfo" fileName="logs/info.log" filePattern="logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log"> <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" /> <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %logger{36} - %msg%n" /> <Policies> <OnStartupTriggeringPolicy /> <SizeBasedTriggeringPolicy size="20 MB" /> <TimeBasedTriggeringPolicy /> </Policies> <!-- DefaultRolloverStrategy屬性如不設定,則預設為最多同一資料夾下7個檔案,這裡設定了30 --> <DefaultRolloverStrategy max="30" /> </RollingFile> <!-- 故障轉移追加器,如果primary追加器失敗了, 就繼續按照順序嘗試Failovers中的appenders --> <Failover name="Failover" primary="MyFile"> <Failovers> <AppenderRef ref="STDOUT"/> </Failovers> </Failover> </Appenders> <Loggers> <Root level="debug"> <AppenderRef ref="STDOUT"/> </Root> </Loggers> </Configuration>
針對RollingFileAppender的筆記↓
測試程式,負責源源不斷地打log:
package org.sample.webapp.util; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class TestLog4j2 { private static final Logger LOGGER = LogManager.getLogger(); public static void main(String[] args) { for (int i = 0; i < 10000; i++) { LOGGER.info("Rolling file appender example..."); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } } }
示例之一(DefaultRolloverStrategy ):
<?xml version="1.0" encoding="UTF-8"?> <!-- 實時寫到mylog.log,每隔兩分鐘進行一次rollover, rollover策略為按照時間作為增量命名日誌檔案並壓縮歸檔。--> <Configuration status="WARN"> <Appenders> <!-- 便於在控制檯觀察實際輸出情況 --> <Console name="STDOUT" target="SYSTEM_OUT"> <PatternLayout> <Pattern>%d{yyyy-MMM-dd HH:mm:ss a} [%t] %-5p %c{-2} - %m%n</Pattern> </PatternLayout> </Console> <!-- 大概可以視為RollingFileAppender的進化版,沒 有bufferedIO這個屬性,對於RollingRandomAccessFile, 快取是固定開啟的。fileName是實時寫入的(未歸檔)文 件名,filePattern則是歸檔檔案的命名模式,因為開啟了 非同步日誌所以這裡immediateFlush設定為false(不過好像 不管它也無所謂),bufferSize緩衝區大小暫時預設, 最後,TriggeringPolicy和RolloverStrategy是必須有的, 沒有顯示定義就會採用預設的。--> <RollingRandomAccessFile name="RollingRandomAccessFile" fileName="logs/mylog.log" immediateFlush="false" filePattern="logs/time-based-logs/%d{yyyy-MM-dd-hh-mm}.log.zip"> <!-- 生成的日誌檔名要麼按照時間來增長,filePattern中需要%d, 要麼就以整數增長,filePattern中需要%i,又或者兩個搭配(意義似乎不是很大 因為rollover一次計數器又從1開始了。。),檔名僅按照時間增長的話, RolloverStrategy設定max,min引數似乎也沒多什麼意義了。--> <!-- 如果filePattern以".gz", ".zip", ".bz2", ".deflate", ".pack200",或者".xz"結尾, 那麼將使用與相對應的壓縮方案壓縮生成的歸檔檔案。--> <PatternLayout> <Pattern>%d{yyyy-MMM-dd HH:mm:ss a} [%t] %-5p %c{-2} - %m%n</Pattern> </PatternLayout> <!--決定是否應該執行rollover,只要有任何一個 policy返回true那麼就進行rollover,rollover的 意思大概可以理解為:當日志文件滿足特定條件時 將觸發的事件,例如建立一個新的檔案/把原有的檔案 歸檔/刪除等,具體怎樣rollover由RolloverStrategy 決定 --> <Policies> <!-- jvm重啟就進行一次rollover--> <OnStartupTriggeringPolicy /> <!-- 檔案大小達到20mb進行一次rollover --> <SizeBasedTriggeringPolicy size="20 MB" /> <!-- TimeBasedTriggeringPolicy是最多用到的Policy, interval預設值是1,根據filePattern中日期的最小單位,例如 在該配置裡是mm(分鐘),設定interval="2"則每隔兩分鐘將發生 一次rollover,按當前配置,具體表現就是隔兩分鐘得到一個log.zip。 modulate就是讓第一次rollover發生在區間邊界上(即便還沒到 interval的時長),按照當前配置,首次rollover會發生在比如 8點50分0秒,這樣之後的rollover就是8點52分0秒、8點54分0秒.. 這樣做的好處在於rollover的時機就變得很有規律很好預測,生成的 檔案還很整齊(假設時間最小單位為天,interval="1",那麼就 變成穩定每天0點自動rollover了。。)。還有個屬性叫maxRandomDelay, 防止很多應用在同一時間一起rollover的,暫時不理它。 --> <TimeBasedTriggeringPolicy interval="2" modulate="true" /> </Policies> <!-- DefaultRolloverStrategy,預設rollover策略。引數: fileIndex有兩個值,max和min,就是決定生成檔案是從序號大的到 序號小的,還是從序號小的到序號大。min,計數器的起始值, 預設是1;max,計數器的最大值,預設是7。還有兩個引數暫時不管。--> <DefaultRolloverStrategy/> </RollingRandomAccessFile> </Appenders> <Loggers> <!-- 用來debug。只要additivity不設定為false,日誌起碼會被列印到控制檯。--> <Root level="debug"> <AppenderRef ref="STDOUT"/> </Root> <!-- 測試物件。將日誌轉發給RollingFileAppender --> <Logger name="org.sample.webapp.util.TestLog4j2" level="debug" additivity="true"> <AppenderRef ref="RollingRandomAccessFile" /> </Logger> </Loggers> </Configuration>
執行若干分鐘後的結果:
下面是官方的example,將反駁上面註釋裡的一些自以為是的觀點。。
/
示例之二,提速版官方xml(DefaultRolloverStrategy ):
<?xml version="1.0" encoding="UTF-8"?> <!-- 將在同一天建立最多7個歸檔(1-7號),這些歸檔儲存在基於 當前年和月的目錄檔案中,並用gzip壓縮每個歸檔,我把所有時間 相關的變小兩個單位修改成:每分鐘最多7個歸檔,並存在基於 日和小時的目錄檔案中,並用gzip壓縮每個歸檔 --> <Configuration status="warn" name="MyApp" packages=""> <Appenders> <!-- 形如$${date:yyyy-MM}參考https://logging.apache.org/log4j/2.x/manual/lookups.html#DateLookup--> <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/$${date:dd-HH}/app-%d{HH-mm-dd}-%i.log.gz"> <!-- 原來的值logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz --> <PatternLayout> <Pattern>%d %p %c{1.} [%t] %m%n</Pattern> </PatternLayout> <Policies> <TimeBasedTriggeringPolicy /> <!-- 所以時間%d和整數%i同時用的意義就在於,當單個日誌檔案到達最大size 的時候建立一個新的檔案 --> <SizeBasedTriggeringPolicy size="1 KB"/> </Policies> </RollingFile> </Appenders> <Loggers> <Root level="debug"> <AppenderRef ref="RollingFile"/> </Root> </Loggers> </Configuration>
執行若干分鐘後的結果:
/
示例之三,提速版本官方xml(DirectWrite Rollover Strategy,好像和預設的也沒多大差別。。)
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="warn" name="MyApp" packages=""> <Appenders> <RollingFile name="RollingFile" filePattern="logs/app-%d{yyyy-MM-dd-mm}-%i.log.gz"> <PatternLayout> <Pattern>%d %p %c{1.} [%t] %m%n</Pattern> </PatternLayout> <Policies> <SizeBasedTriggeringPolicy size="2 KB"/> </Policies> <!-- 直接往filePattern所指定的檔案寫,沒有rename這個環節--> <DirectWriteRolloverStrategy maxFiles="10"/> </RollingFile> </Appenders> <Loggers> <Root level="debug"> <AppenderRef ref="RollingFile"/> </Root> </Loggers> </Configuration>
執行若干分鐘的結果: