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.loglogs/backup:test-1.logtest-2.logtest-3.logtest-4.logtest-5.logtest-6.logtest-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.loglogs/backup:test-1.logtest-2.logtest-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.loglogs/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.loglogs/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.loglogs/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 入门教程

Log4j2进阶使用(按大小时间备份日志)相关推荐

  1. log4j2到oracle,Log4j2进阶使用(更多高级特性)

    # 1.高级进阶说明 本文介绍Log4j2高级进阶使用, 基于[Log4j2进阶使用(按大小时间备份日志)](https://www.jianshu.com/p/c7ae523f6e82), 介绍更多 ...

  2. Log4j2进阶使用(更多高级特性)

    1.高级进阶说明 本文介绍Log4j2高级进阶使用, 基于Log4j2进阶使用(按大小时间备份日志), 介绍更多的高级特性, 本文基于上文给出的完整log4j2.xml, 修改对应的配置项, 演示高级 ...

  3. Log4j2进阶使用(Pattern Layout详细设置)

    1.进阶说明 通过配置Layout打印格式化的日志, Log4j2支持很多的Layouts: CSV GELF HTML JSON Pattern Serialized Syslog XML YAML ...

  4. 用 Crontab 进行简单的备份日志任务计划

    萌新在实验楼学习Linux做实验的时候遇到的,有点小小的麻烦,所以记录下过程 任务 小明是一个服务器管理员,他需要每天备份论坛数据(这里我们用 alternatives.log 日志替代),备份当天的 ...

  5. 数据库服务器备份日志文件,数据库服务器备份日志文件

    数据库服务器备份日志文件 内容精选 换一换 使用自定义脚本实现数据库备份完成后,可以通过如下操作验证数据库备份结果是否成功.本章节以SQL_SERVER数据库为例进行验证. 业界对备份一致性的定义包括 ...

  6. springmvc使用log4j2的配置,以及解决controller日志只有控制台打印日志,不生成本项目文件夹下

    文章目录 1.引包 2. log4j2.xml的配置 3.配置文件中的一些说明 springmvc使用log4j2的配置,以及只有控制台打印日志,不生成文件的解决方式,mvc使用log4j2时会出现在 ...

  7. Linux 定时备份日志

    什么是日志文件?为什么要设立日志文件? 1.日志文件是用来记录事务对数据库的更新操作的文件. 2.设立日志文件的目的是: 进行事务故障恢复;进行系统故障恢复;协助后备副本进行介质故障恢复. 但是,随着 ...

  8. 实验楼_Linux基础入门_挑战2_备份日志

    备份日志 题目 小明是一个服务器管理员,他需要每天备份论坛数据(这里我们用日志替代),备份当天的日志并删除之前的日志.而且备份之后文件名是年-月-日的格式.alternatives.log在/var/ ...

  9. shell脚本提取服务器一段时间的日志并输出异常结果

    shell脚本提取服务器一段时间的日志并输出异常结果 参考文章: (1)shell脚本提取服务器一段时间的日志并输出异常结果 (2)https://www.cnblogs.com/cheerjude/ ...

最新文章

  1. 国家卫计委倡导健康生活理念:每天发呆5分钟
  2. spring-boot:run 是怎么运行 Spring Boot 项目的?
  3. BZOJ3916 [Baltic2014]friends
  4. go本地调用image-syncer
  5. IE下 c00ce56e 错误竟然是nginx 字符设置的问题
  6. C++实现数组模拟链表(实现链表的增删功能)
  7. JqueryCookie
  8. Airmail 5 for Mac(轻量级邮件客户端)
  9. svm分类代码_数据挖掘入门系列教程(九)之基于sklearn的SVM使用
  10. 安卓pdf阅读器_2020年双十一有哪些电纸书、电子书阅读器值得买?Kindle、掌阅、文石、科大讯飞哪个好?...
  11. Aggressive cows--二分法思想
  12. linux虚拟机怎么恢复出厂设置_恢复出厂设置,真的能让旧手机变快吗?【两分回顾】...
  13. 如何对OA 系统进行服务器迁移,OA服务器迁移心得体会.doc
  14. 程序员“真实”日常:每天敲代码不到 1 小时
  15. OpenCascade源码分析之BRepMesh_IncrementalMesh(网格离散化操作)
  16. Tiny4412 在linux下的dnw使用
  17. [P2698][USACO12MAR]花盆Flowerpot
  18. ​不为人知的故事——主流加密背后的男人
  19. 24个提高你的知识和技能极限的数据科学(机器学习)项目(免费)
  20. php照片墙,用CSS3制作照片墙的特效

热门文章

  1. day18__文件操作
  2. requests中获取请求到文本编码格式
  3. 使用Notepad++自动排版代码
  4. Javascript面向对象编程(一):对象的产生
  5. 中移动将整合手机邮箱和飞信业务
  6. Python异常:IndentationError: unexpected unindent
  7. GBDT和XGBoost
  8. Snabbdom(虚拟dom-9-patchVnode函数)
  9. SearchParams(URL获取参数)
  10. rust 案例_Rust特殊枚举Option用法