Log4j2進階使用(按大小時間備份日志)


1.進階說明

本文介紹Log4j2進階使用,
基本使用請參考Log4j2基本使用入門
本文基於上面的基本使用入門,
主要介紹按照日志大小和時間備份日志,
並且限制備份日志的個數,
以及刪除過期的備份日志。

由於日志信息是不斷追加到日志文件的,
經過一段時間會導致日志文件很大,
所以需要及時分割過大的日志文件,
以及限制日志文件占用的硬盤空間,
及時清理掉不用的過期的日志文件。

2.RollingFileAppender

RollingFileAppender能實現上面提出的需求,
它需要配置TriggeringPolicy和RolloverStrategy,
TriggeringPolicy觸發策略決定何時執行備份,
RolloverStrategy翻轉策略決定如何執行備份。
如果沒有配置RolloverStrategy翻轉策略,
RollingFileAppender將使用DefaultRolloverStrategy,
而且DefaultRolloverStrategy支持自定義刪除文件操作。

3.添加全局變量

<properties>
    <property name="LOG_HOME">logs</property>
    <property name="LOG_BACKUP">backup</property>
    <property name="FILE_NAME">test</property>
</properties>

LOG_HOME用於指定當前日志存放的目錄,
LOG_BACKUP用於指定備份日志存放的目錄,
FILE_NAME用於指定日志文件的名稱。
在需要的地方使用${LOG_HOME}引用即可。

4.按大小備份

本章通過配置log4j2.xml,
實現如下目標:
最多保存3個日志備份文件,
每個日志文件大小不超過1MB。

4.1.添加自定義Appender

<Appenders>
    <RollingFile name="RollingSizeFile" fileName="${LOG_HOME}/${FILE_NAME}.log"
        filePattern="${LOG_HOME}/${LOG_BACKUP}/${FILE_NAME}-%i.log">
        <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        <Policies>
            <SizeBasedTriggeringPolicy size="1MB" />
        </Policies>
    </RollingFile>
</Appenders>

這里增加了一個類型為RollingFile的Appender,
name為RollingSizeFile,
FileName為${LOG_HOME}/${FILE_NAME}.log,
指定了當前正在打印的日志文件名稱,
和文件存放的相對路徑;
filePattern為${LOG_HOME}/${LOG_BACKUP}/${FILE_NAME}-%i.log,
指定了備份后的日志文件名稱和存放路徑,
其中%i表示備份文件名按照正整數開始遞增。
SizeBasedTriggeringPolicy策略指定了文件大小,

<SizeBasedTriggeringPolicy size="1MB" />

當日志文件達到1MB時生成備份文件,
大小以字節為單位指定,
后綴為KB、MB或GB,例如1GB。

<SizeBasedTriggeringPolicy/>

如果不填,默認值為10MB。

4.2.添加自定義Logger

<Loggers>
    <Logger name="org.apache.logging.log4j" level="ERROR" additivity="false">
        <AppenderRef ref="RollingSizeFile" />
    </Logger>
</Loggers>

AppenderRef指定打印日志到新增的name為RollingSizeFile的Appender。

4.3.打印日志

運行測試程序,
打印一段時間的日志,
在項目下會生成如下目錄和文件:

logs/:
    backup/
    test.log

logs/backup:
    test-1.log
    test-2.log
    test-3.log
    test-4.log
    test-5.log
    test-6.log
    test-7.log

可以看到logs目錄下有test.log文件和backup目錄,
backup目錄下有test-1.log等7個備份文件,
而且每個文件的大小都是1MB。
上面由於沒有配置RolloverStrategy滾動策略,
RollingFileAppender使用DefaultRolloverStrategy,
DefaultRolloverStrategy默認最多保存7個備份文件。

4.4.修改自定義Appender

RollingFile中增加DefaultRolloverStrategy默認滾動策略,
並且指定最多保存3個備份文件:

<DefaultRolloverStrategy max="3" />

修改后效果如下:

logs/:
    backup/
    test.log

logs/backup:
    test-1.log
    test-2.log
    test-3.log

5.按時間備份

本章通過配置log4j2.xml,
實現如下目標:
每1分鍾備份一次日志文件,
刪除3分鍾前備份的日志文件。

5.1.添加自定義Appender

<Appenders>
    <RollingFile name="RollingTimeFile" fileName="${LOG_HOME}/${FILE_NAME}.log"
        filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd-HH-mm}.log">
        <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        <Policies>
            <TimeBasedTriggeringPolicy interval="1" />
        </Policies>
    </RollingFile>
</Appenders>

這里的配置和第4步中略有不同,
name為RollingTimeFile,
主要是filePattern、TimeBasedTriggeringPolicy配置不一樣,
filePattern為${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd-HH-mm}.log,
其中$${date:yyyy-MM}指定了備份文件存放的目錄為當前年月,
比如目錄2019-09,而不是backup了,
${FILE_NAME}-%d{yyyy-MM-dd-HH-mm}.log指定了備份后的日志文件名稱,
精確到分鍾的一個時間戳。

TimeBasedTriggeringPolicy策略指定了生成備份文件的策略。

<TimeBasedTriggeringPolicy interval="1" />

這個配置要和filePattern結合使用,
上面filePattern中的命名規則是${FILE_NAME}-%d{yyyy-MM-ddHH-mm}.log,
最小的時間粒度是mm,即分鍾,
而TimeBasedTriggeringPolicy設置的interval是1,
結合起來就是每1分鍾生成一個新文件。
同理,如果要每1小時生成一個新文件,
則改成%d{yyyy-MM-ddHH},最小粒度為小時,
如果再把interval該為12,
那就是每12小時生成一個新文件。

5.2.添加自定義Logger

<Loggers>
    <Logger name="org.apache.logging.log4j" level="ERROR" additivity="false">
        <AppenderRef ref="RollingTimeFile" />
    </Logger>
</Loggers>

AppenderRef指定打印日志到新增的name為RollingTimeFile的Appender。

5.3.打印日志

運行測試程序,
打印一段時間的日志,
在項目下會生成如下目錄和文件:

logs/:
2019-09/
test.log

logs/2019-09:
test-2019-09-27-17-20.log
test-2019-09-27-17-21.log
test-2019-09-27-17-22.log
test-2019-09-27-17-23.log
test-2019-09-27-17-24.log
test-2019-09-27-17-25.log
test-2019-09-27-17-26.log
test-2019-09-27-17-27.log
test-2019-09-27-17-28.log
test-2019-09-27-17-29.log
test-2019-09-27-17-30.log
test-2019-09-27-17-31.log
test-2019-09-27-17-32.log
test-2019-09-27-17-33.log

可以看到logs目錄下有test.log文件和2019-09備份目錄,
2019-09目錄下有test-2019-09-27-17-20.log等14個備份文件,
而且每個文件的大小都不一樣,和時間段內打印的日志多少有關。
隨着時間推移會生成2019-10之類的目錄,
而且目錄下的備份文件也會越來越多。

5.4.修改自定義Appender

RollingFile中增加DefaultRolloverStrategy策略,
刪除3分鍾前備份的日志文件:

<DefaultRolloverStrategy>
    <Delete basePath="${LOG_HOME}" maxDepth="2">
        <IfFileName glob="*/*.log" />
        <IfLastModified age="3M" />
    </Delete>
</DefaultRolloverStrategy>

Delete表示刪除滿足條件的文件,
basePath指定了需要處理的日志目錄,
因為備份的日志在basePath下的年月目錄($${date:yyyy-MM}),
所以maxDepth設置為2,代表掃描的目錄深度,
maxDepth="1"表示當前目錄。
指定文件名稱:

<IfFileName glob="*/*.log" />

匹配二級目錄下的擴展名為.log的文件。

指定文件過期時間:

<IfLastModified age="3M" />

age的單位:D、H、M、S,分別表示天、小時、分鍾、秒。
批量最后修改時間為3分鍾前的文件。

修改后效果如下:

logs/:
2019-09/
test.log

logs/2019-09:
test-2019-09-29-15-41.log
test-2019-09-29-15-42.log
test-2019-09-29-15-43.log

查看的時間是2019-09-29 15:44,
只保存了前3分鍾內生成的3個日志,
隨着時間的推移,
生成新日志test-2019-09-29-15-44.log,
刪除舊日志test-2019-09-29-15-41.log,
該目錄下始終只有當前時間3分鍾內的備份日志。

6.按大小和時間備份

可以把按大小和時間備份結合起來使用,
實現更復雜的日志文件備份需求。
本章通過配置log4j2.xml,
實現如下目標:
每1分鍾備份一次日志文件,
每個日志文件大小不超過1MB,
如果在1分鍾內日志文件超過1MB,
則生成以當前時間+序號的備份日志,
但是每分鍾內最多保存3個備份日志,
並且刪除5分鍾前備份的日志文件。

6.1.自定義Appender

<Appenders>
    <RollingFile name="RollingFile" fileName="${LOG_HOME}/${FILE_NAME}.log"
        filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd-HH-mm}-%i.log">
        <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        <Policies>
            <TimeBasedTriggeringPolicy interval="1" />
            <SizeBasedTriggeringPolicy size="1MB" />
        </Policies>
        <DefaultRolloverStrategy max="3">
            <Delete basePath="${LOG_HOME}" maxDepth="2">
                <IfFileName glob="*/*.log" />
                <IfLastModified age="5M" />
            </Delete>
        </DefaultRolloverStrategy>
    </RollingFile>
</Appenders>

大部分配置和上面說過的一致,
就是簡單的組合起來即可,
需要注意的是filePattern:

filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd-HH-mm}-%i.log"

備份文件名${FILE_NAME}-%d{yyyy-MM-dd-HH-mm}-%i.log結合了時間和序號。

6.3.打印日志

運行測試程序,
打印一段時間的日志,
在項目下會生成如下目錄和文件:

logs/:
2019-09/
test.log

logs/2019-09:
test-2019-09-29-16-47-1.log
test-2019-09-29-16-47-2.log
test-2019-09-29-16-47-3.log
test-2019-09-29-16-48-1.log
test-2019-09-29-16-48-2.log
test-2019-09-29-16-48-3.log
test-2019-09-29-16-49-1.log
test-2019-09-29-16-49-2.log
test-2019-09-29-16-49-3.log
test-2019-09-29-16-50-1.log
test-2019-09-29-16-50-2.log
test-2019-09-29-16-50-3.log
test-2019-09-29-16-51-1.log
test-2019-09-29-16-51-2.log
test-2019-09-29-16-51-3.log

看到2019-09目錄下只有5分鍾內的備份日志,
每分鍾的備份日志最多有3個文件,
根據日志具體打印的情況,
少的時候可能1分鍾只有1或者2個文件,
多的時候最多也只有3個文件,
在這1分鍾內后生成的日志會覆蓋掉前面的。

7.完整log4j2.xml

下面給出完整的配置文件,
供大家開發時參考使用:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="5">
    <properties>
        <property name="LOG_HOME">logs</property>
        <property name="FILE_NAME">test</property>
    </properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
        <RollingFile name="RollingFile" fileName="${LOG_HOME}/${FILE_NAME}.log"
            filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd-HH-mm}-%i.log">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" />
                <SizeBasedTriggeringPolicy size="1MB" />
            </Policies>
            <DefaultRolloverStrategy max="3">
                <Delete basePath="${LOG_HOME}" maxDepth="2">
                    <IfFileName glob="*/*.log" />
                    <IfLastModified age="5M" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Logger name="org.apache.logging.log4j" level="TRACE" additivity="false">
            <AppenderRef ref="RollingFile" />
        </Logger>
        <Root level="ERROR">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

8.參考文章

slf4j+log4j2基礎教程(拿來即用教程)
log4j2 RollingRandomAccessFile配置
log4j2 入門教程


免責聲明!

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



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