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

Log4j2进阶使用(按大小时间备份日志)的更多相关文章

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

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

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

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

  3. Nginx服务优化及优化深入(配置网页缓存时间、日志切割、防盗链等等)

    原文:https://blog.51cto.com/11134648/2134389 默认的Nginx安装参数只能提供最基本的服务,还需要调整如网页缓存时间.连接超时.网页压缩等相应参数,才能发挥出服 ...

  4. Linux下使用crontab定时备份日志

    上周学习了Linux,其中有使用crontab定时备份日志的内容,现把主要步骤记录如下: 首先需要备份的日志的源目录位于/opt/lampp/logs/access_log 备份到/tmp/logs下 ...

  5. linux 系统备份日志

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

  6. linux按时间查询日志

    在系统应用集中部署的时候,很多日志因为太多难以定位,获取某段时间的日志是对运维人员非常关键的事情. 一.sed查看某时间段到现在的系统日志: sed  -n  '/May 20 17/,$p'   / ...

  7. logback 设置按天,文件切割大小,总共日志文件大小。

    设置按天,文件切割大小,总共日志文件大小. <?xml version="1.0" encoding="UTF-8"?> <configura ...

  8. salt上编写了备份日志的脚本

    我在salt上编写了备份日志的脚本,在/opt/CardServer下的主程序目录只保留当天的日志,/opt/log_del目录会保存7天的日志.salt * state.sls script.log ...

  9. python通过TimedRotatingFileHandler按时间切割日志

    通过TimedRotatingFileHandler按时间切割日志 线上跑了一个定时脚本,每天生成的日志文件都写在了一个文件中.但是日志信息不可能输出到单一的一个文件中. 原因有二:1.日志文件越来越 ...

随机推荐

  1. OS开发之Objective-C与JavaScript的交互

    UIWebView是iOS最常用的SDK之一,它有一个stringByEvaluatingJavaScriptFromString方法可以将javascript嵌入页面中,通过这个方法我们可以在iOS ...

  2. zabbix之故障自治愈和分层报警

    在agent端修改配置文件 root@ubuntu:~# vim /etc/sudoers zabbix ALL=(ALL) NOPASSWD:ALL#:重启服务root@ubuntu:~# syst ...

  3. zookeeper 异常 :stat is not executed because it is not in the whitelist. Connection closed b

    1 .问题 1.启动 zookeeper 后 用指令:  telnet 127.0.0.1 2181 连接 提示输入指令 :stat 后报错,然后关闭连接 2.问题解决: 修改启动指令 zkServe ...

  4. 【Java 8】方法引用

    一.概述 在学习lambda表达式之后,我们通常使用lambda表达式来创建匿名方法.然而,有时候我们仅仅是调用了一个已存在的方法.如下: Arrays.sort(stringsArray,(s1,s ...

  5. SpringBoot项目找不到主类或无法加载主类

    问题描述 启动springboot项目的时候发现启动失败,查看日志发现因为找不到主类或无法加载主类. 解决 我这个项目是拉取的别人git上的项目,看了一下目录结构发现没有编译后的文件(target目录 ...

  6. matplotlib画3d图

    import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3D fig = plt.f ...

  7. 详解 java 异常

    Throwable 可以用来表示任何可以作为异常抛出的类(注意,是类不是接口),分为两种: Error(注意!error也是可以throw的,但是不建议) 和 Exception. 其中 Error ...

  8. 【模型推理】Tengine 模型转换及量化

      欢迎关注我的公众号 [极智视界],回复001获取Google编程规范   O_o   >_<   o_O   O_o   ~_~   o_O   本文介绍一下 Tengine 模型转换 ...

  9. Mysql实例 表设计

    目录 一.介绍 二.设计表格 三.查询 查都有哪些公司 查A公司都放了哪些广告 查A公司10月份该交多少广告费 四.分析 表结构设置 sql语句 其它功能 一.介绍 有一个公司叫月亮集团,他们旗下有很 ...

  10. DevOps到底是什么意思?

    目录 一.方法论 二.DevOps的起源 三.DevOps到底是什么 四.DevOps的发展现状 五.DevOps与虚拟化.容器.微服务 一.方法论 提到DevOps这个词,我相信很多人一定不会陌生. ...