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. [学习总结]4、Android的ViewGroup中事件的传递机制(一)

    本文主要针对dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent三个方法,通过简单的例子来简单的介绍下. 根据字面意思的理解,dispatchTo ...

  2. java通过反射获取Java对象属性值

    说明: 作为反射工具类,通过对象和属性的名字获取对象属性的值,如果在当前对象属性没有找到,依次向上收集所有父类的属 性,直到找到属性值,没有找到返回null: 代码: 1.classUtil pack ...

  3. Gitlab-CICD实践篇

    一.背景 随着公司项目使用gitlab越来越多,业务发布的次数越来越频繁,对于发布效率提出了更高的要求.从2012开始,Gitlab官方开始集成了Continuous Integration (CI) ...

  4. Jenkins 报错合集

    目录 一.启动项目显示,没有接受许可之前不能够自动安装 二.明明配置了jdk但还是说找不到 三.jenkins-RestAPI调用出现Error 403 No valid crumb was incl ...

  5. 车载以太网第二弹|测试之实锤-1000BASE-T1物理层PMA测试实践

    背景 100BASE-T1方兴未艾,国内外OEM量产车型纷至沓来:为了满足高带宽的应用场景需求(如图像.雷达等数据传输),1000BASE-T1将至已至,如大众MEB平台采用1000BASE-T1总线 ...

  6. [BUUCTF]PWN16——jarvisoj_level2

    [BUUCTF]PWN16--jarvisoj_level2 附件 步骤 例行检查,32位,开启了nx保护 试运行一下程序 32位ida载入,shift+f12查看一下程序里的字符串,发现了syste ...

  7. 【大咖直播】Elastic 企业搜索实战工作坊(第二期)

    借助 App Search 提供的内置功能,您可轻松打造卓越的搜索体验.直观的相关度调整以及开箱即用的搜索分析,不仅可以优化所提供的内容,其提供的 API 还可帮助您将位于各处的所有内容源关联在一起. ...

  8. java 多线程:Thread类常用方法:setPriority优先级、interrupt中断标记、suspend暂停与唤醒resume(已过时);daemon守护线程

    常用方法: boolean isAlive() 测试此线程是否存活. boolean isDaemon() 测试此线程是否为守护程序线程. static void sleep?(long millis ...

  9. Shell 丢弃错误和输出信息

    shell中使用>/dev/null 2>&1 丢弃信息   在一些Shell脚本中,特别是Crontab的脚本中,经常会看到 >/dev/null 2>&1这 ...

  10. Flink的窗口处理机制(一)

    一.为什么需要 window ? 在流处理应用中,数据是连续不断的,即数据是没有边界的,因此我们不可能等到所有数据都到了才开始处理.当然我们可以每来一个消息就处理一次,但是有时我们需要做一些聚合类的处 ...