log4j2筆記 #04# Appender的三個基本款以及RollingFile的各種示例配置


// 留着備用。

三個基本款分別是ConsoleAppender、FileAppender(以及他的兄弟RandomAccessFileAppender)、RollingFileAppender(以及他的兄弟RollingRandomAccessFileAppender),其中RollingFileAppender是三個appender中的老大,因為他一個人的文檔篇幅就是其它兩個appender文檔篇幅總和的6~7倍左右。。。

關於三個appender的簡單介紹:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="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>

運行若干分鍾的結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM