1.高级进阶说明

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

2.调整日志备份时间

按时间备份日志文件的时候,
可以指定modulate为true:

<TimeBasedTriggeringPolicy interval="10" modulate="true"/>

表示对备份日志的生成时间纠偏,
纠偏以零点为基准进行,
即日志时间将以0点为边界进行偏移计算。
如果每4小时备份一次日志,
假设当前时间是凌晨3点,
那么下次生成日志时间是4点,8点,12点等等。
如果每10分钟备份一次日志,
假设当前时间是09:58,
那么下次生成日志时间是10:00, 10:10, 10:20等等。
具体效果就是不管当前的运行时间,
生成的备份日志时间是可以预期的,
有规律的,便于查看的。

运行测试程序效果如下:

logs/:
10月 10 10:30 2019-10/
10月 10 10:36 test.loglogs/2019-10:
10月 10 09:59 test-2019-10-10-09-59-1.log
10月 10 10:09 test-2019-10-10-10-09-1.log
10月 10 10:19 test-2019-10-10-10-19-1.log

可以看到在09:59, 10:09, 10:19等时间生成了备份日志。
发现实际文件时间和预期的时间都差了1分钟,
查看Log4j2源码:

org.apache.logging.log4j.core.appender.rolling.PatternProcessor.getNextTime(long, int, boolean)
cal.set(Calendar.MINUTE, currentCal.get(Calendar.MINUTE));
if (frequency == RolloverFrequency.EVERY_MINUTE) {increment(cal, Calendar.MINUTE, increment, modulus);nextTime = cal.getTimeInMillis();cal.add(Calendar.MINUTE, -1);nextFileTime = cal.getTimeInMillis();return debugGetNextTime(nextTime);
}

可以看到nextTime和nextFileTime确实差了1分钟,
也就是备份日志文件的时间比预期时间差1个单位,
因此如果每4小时备份一次日志,
那么下次生成的日志文件时间是3点,7点,11点等等,
实际比预期都差了1个小时。
按照时间备份日志文件,
时间单位可以是年,月,日,小时,分钟,秒,毫秒,星期,
生成的备份文件就是上一个时间单位的时间,
比如备份的就是去年,上个月,昨天的日志等等,
因此实际减去1个时间单位是合理的。

3.压缩日志

通过配置filePattern文件的后缀名,
可以实现在备份日志时对日志文件进行压缩。
支持的文件压缩格式:.gz, .zip, .bz2, .deflate, .pack200,.xz。
生成的归档文件将使用匹配后缀的压缩方案进行压缩。

<RollingFile name="RollingFile" fileName="${LOG_HOME}/${FILE_NAME}.log"filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd-HH}-%i.log.zip">

上面的配置中filePattern以.zip结尾,
表示备份文件压缩为zip格式。
运行测试程序效果如下:

logs/:
2019-10/
test.loglogs/2019-10:
test-2019-10-10-15-03-1.log.zip
test-2019-10-10-15-04-1.log.zip
test-2019-10-10-15-05-1.log.zip

可以看到备份的日志文件都压缩为zip格式,
而且文件占用硬盘空间更少了。

同时DefaultRolloverStrategy支持配置日志压缩级别,
设置compressionLevel属性,范围0-9,
压缩效果依次增大,
0不压缩,1压缩速度最快,9压缩率最好,
但是只对于压缩文件类型有效,
目前Log4j2只实现了zip压缩文件支持compressionLevel。

<DefaultRolloverStrategy compressionLevel="1">

如果不填写压缩级别,默认是DEFAULT_COMPRESSION(-1)。
查看Log4j2压缩代码实现,
调用的是jdk提供的zip压缩:

java.util.zip.ZipOutputStream.setLevel(int)
/*** Sets the compression level for subsequent entries which are DEFLATED.* The default setting is DEFAULT_COMPRESSION.* @param level the compression level (0-9)* @exception IllegalArgumentException if the compression level is invalid*/
public void setLevel(int level) {def.setLevel(level);
}

下面的配置表示备份文件压缩为gz格式:

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

4.敏感日志设置

Layout支持replace功能,
可以通过正则表达式查找%msg的内容,
并且替换为想要输出的内容,
可以实现把敏感日志替换为其他字符。
下面replace把msg中的error全部替换为*****:

%replace{%msg}{error}{*****}

需要注意的这里replace只支持正常打印的内容,
不支持exception(即catch捕获的error会直接输出)。

log4j2.xml配置参考:

<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level [%L] - %replace{%msg}{error}{*****}%n" />

修改前打印日志:

2019-10-23 16:20:23.085 [main] ERROR [18] - error level log
2019-10-23 16:20:23.085 [main] FATAL [19] - fatal level log

修改后打印日志:

2019-10-23 16:20:25.073 [main] ERROR [18] - ***** level log
2019-10-23 16:20:25.083 [main] FATAL [19] - fatal level log

5.参考文章

Log4j2基本使用入门
Log4j2进阶使用(按大小时间备份日志)
Log4j2进阶使用(Pattern Layout详细设置)
Log4j2完整XML参考(详细注释说明)

Log4j2进阶使用(更多高级特性)相关推荐

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

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

  2. OpenMLDB 进阶使用攻略和高级特性介绍

    本文整理自 OpenMLDB PMC 张浩在 OpenMLDB Meetup No.6 中的分享 --<OpenMLDB 进阶使用和高级特性介绍>. 大家好,我是 OpenMLDB PMC ...

  3. 如何在 ASP.NET Core 中使用 NLog 的高级特性

    NLog 是一个开源的轻量级日志框架,提供了丰富的日志路由和管理功能,同时 NLog 也是非常容易的去配置和扩展,其实在之前的文章中我已经讨论过了 Nlog,在这篇我准备继续和大家讨论一下 NLog ...

  4. Redis进阶实践之五Redis的高级特性

    一.引言 上一篇文章写了Redis的特征,使用场景,同时也介绍了Redis的基本数据类型,redis的数据类型是操作redis的基础,这个必须好好的掌握.今天我们开始介绍一些Redis的高级特性,虽然 ...

  5. Python 进阶:全面解读高级特性之切片!

    作者 | 豌豆花下猫 责编 | 胡巍巍 众所周知,我们可以通过索引值(或称下标)来查找序列类型(如字符串.列表.元组-)中的单个元素,那么,如果要获取一个索引区间的元素该怎么办呢? 切片(slice) ...

  6. Java 高级特性 --- 反射

    From:Java 高级特性 --- 反射:https://www.jianshu.com/p/9be58ee20dee From:Java 基础之 --- 反射(非常重要):https://blog ...

  7. 深入理解java虚拟机 - jvm高级特性与最佳实践(第三版)_JVM虚拟机面试指南:年薪30W以上高薪岗位需求的JVM,你必须要懂!...

    JVM的重要性 很多人对于为什么要学JVM这个问题,他们的答案都是:因为面试.无论什么级别的Java从业者,JVM都是进阶时必须迈过的坎.不管是工作还是面试中,JVM都是必考题.如果不懂JVM的话,薪 ...

  8. C语言程序设计(三)高级特性

    C语言高级特性 前面我们了解了C语言的相关基础内容,我们来看看C语言的高级部分.这一章的学习难道会比较大,尤其是指针板块,因为需要理解计算机内存模型,所以说是很多初学者的噩梦. 函数 其实函数我们在一 ...

  9. Redis基础、高级特性与性能调优

    点击上方 "编程技术圈"关注, 星标或置顶一起成长 后台回复"大礼包"有惊喜礼包! 每日英文 Life is too short to spend time r ...

最新文章

  1. linux c 宏定义 #define _GNU_SOURCE 含义
  2. 光耦p621引脚图_光耦反馈设计再也不愁!开关电源中的几种典型光耦隔离接法对比...
  3. SAP Cloud for Customer(C4C)后台ABAP系统的System ID和client ID
  4. 【渝粤教育】电大中专财务管理与分析 (2)作业 题库
  5. 实验项目 3-4:一元多项式的乘法与加法运算
  6. jsp和java使用值_如何将表单的值从jsp发送到Java
  7. C语言基本语法——结构体、联合和枚举
  8. 前端性能优化(一)-- 文件的压缩与合并
  9. matlab2c使用c++实现matlab函数系列教程-prod函数
  10. [canvas基础]pcmobile写字板
  11. 微信小程序跳转至京东店铺首页
  12. 计算机如何分屏操作步骤,win7怎么设置电脑分屏显示|win7分屏显示设置方法
  13. Java链表数据结构刷题笔记总结
  14. [Canvas] 手机拍照后,等比例压缩并上传图片
  15. cpu排行计算机专业,cpu性能天梯图,教您电脑cpu排行榜
  16. 一、ElasticSearch5.6.3下载安装步骤 说明:ElasticSearch的运行不能用root执行,自己用useradd命令新建一个用户如下所示: sueradd chen passw
  17. Kersion CMS 标签使用大全
  18. Linux学习笔记1(鸟哥的私房菜)
  19. mpvue 微信小程序获取 国家、省份、城市、区域 getLocations
  20. python读取字符报错:‘utf-8‘ codec can‘t decode byte 0xbd in position 2: invalid start byte

热门文章

  1. Python3 从零单排7_模块ossys
  2. 用node-webkit把web应用打包成桌面应用
  3. 使用PDO连接数据库 查询和插入乱码的解决方法
  4. Delphi面向对象学习随笔一:类与对象的关系
  5. HTML5 文档头部
  6. c语言链表递增,[C语言][PTA][2019Fall] 6-28 递增的整数序列链表的插入 (15 point(s))
  7. Safari 时间格式转换 NAN 问题
  8. 红帽linux 竞争对手,为什么红帽不把CentOS当作竞争对手?
  9. mysql jooyoo net_.net连接MySQL的方法
  10. 解决linux下终端无法输入的假死问题