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 入門教程
