Log4j2进阶使用(更多高级特性)
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进阶使用(更多高级特性)相关推荐
- log4j2到oracle,Log4j2进阶使用(更多高级特性)
# 1.高级进阶说明 本文介绍Log4j2高级进阶使用, 基于[Log4j2进阶使用(按大小时间备份日志)](https://www.jianshu.com/p/c7ae523f6e82), 介绍更多 ...
- OpenMLDB 进阶使用攻略和高级特性介绍
本文整理自 OpenMLDB PMC 张浩在 OpenMLDB Meetup No.6 中的分享 --<OpenMLDB 进阶使用和高级特性介绍>. 大家好,我是 OpenMLDB PMC ...
- 如何在 ASP.NET Core 中使用 NLog 的高级特性
NLog 是一个开源的轻量级日志框架,提供了丰富的日志路由和管理功能,同时 NLog 也是非常容易的去配置和扩展,其实在之前的文章中我已经讨论过了 Nlog,在这篇我准备继续和大家讨论一下 NLog ...
- Redis进阶实践之五Redis的高级特性
一.引言 上一篇文章写了Redis的特征,使用场景,同时也介绍了Redis的基本数据类型,redis的数据类型是操作redis的基础,这个必须好好的掌握.今天我们开始介绍一些Redis的高级特性,虽然 ...
- Python 进阶:全面解读高级特性之切片!
作者 | 豌豆花下猫 责编 | 胡巍巍 众所周知,我们可以通过索引值(或称下标)来查找序列类型(如字符串.列表.元组-)中的单个元素,那么,如果要获取一个索引区间的元素该怎么办呢? 切片(slice) ...
- Java 高级特性 --- 反射
From:Java 高级特性 --- 反射:https://www.jianshu.com/p/9be58ee20dee From:Java 基础之 --- 反射(非常重要):https://blog ...
- 深入理解java虚拟机 - jvm高级特性与最佳实践(第三版)_JVM虚拟机面试指南:年薪30W以上高薪岗位需求的JVM,你必须要懂!...
JVM的重要性 很多人对于为什么要学JVM这个问题,他们的答案都是:因为面试.无论什么级别的Java从业者,JVM都是进阶时必须迈过的坎.不管是工作还是面试中,JVM都是必考题.如果不懂JVM的话,薪 ...
- C语言程序设计(三)高级特性
C语言高级特性 前面我们了解了C语言的相关基础内容,我们来看看C语言的高级部分.这一章的学习难道会比较大,尤其是指针板块,因为需要理解计算机内存模型,所以说是很多初学者的噩梦. 函数 其实函数我们在一 ...
- Redis基础、高级特性与性能调优
点击上方 "编程技术圈"关注, 星标或置顶一起成长 后台回复"大礼包"有惊喜礼包! 每日英文 Life is too short to spend time r ...
最新文章
- linux c 宏定义 #define _GNU_SOURCE 含义
- 光耦p621引脚图_光耦反馈设计再也不愁!开关电源中的几种典型光耦隔离接法对比...
- SAP Cloud for Customer(C4C)后台ABAP系统的System ID和client ID
- 【渝粤教育】电大中专财务管理与分析 (2)作业 题库
- 实验项目 3-4:一元多项式的乘法与加法运算
- jsp和java使用值_如何将表单的值从jsp发送到Java
- C语言基本语法——结构体、联合和枚举
- 前端性能优化(一)-- 文件的压缩与合并
- matlab2c使用c++实现matlab函数系列教程-prod函数
- [canvas基础]pcmobile写字板
- 微信小程序跳转至京东店铺首页
- 计算机如何分屏操作步骤,win7怎么设置电脑分屏显示|win7分屏显示设置方法
- Java链表数据结构刷题笔记总结
- [Canvas] 手机拍照后,等比例压缩并上传图片
- cpu排行计算机专业,cpu性能天梯图,教您电脑cpu排行榜
- 一、ElasticSearch5.6.3下载安装步骤 说明:ElasticSearch的运行不能用root执行,自己用useradd命令新建一个用户如下所示: sueradd chen passw
- Kersion CMS 标签使用大全
- Linux学习笔记1(鸟哥的私房菜)
- mpvue 微信小程序获取 国家、省份、城市、区域 getLocations
- python读取字符报错:‘utf-8‘ codec can‘t decode byte 0xbd in position 2: invalid start byte
热门文章
- Python3 从零单排7_模块ossys
- 用node-webkit把web应用打包成桌面应用
- 使用PDO连接数据库 查询和插入乱码的解决方法
- Delphi面向对象学习随笔一:类与对象的关系
- HTML5 文档头部
- c语言链表递增,[C语言][PTA][2019Fall] 6-28 递增的整数序列链表的插入 (15 point(s))
- Safari 时间格式转换 NAN 问题
- 红帽linux 竞争对手,为什么红帽不把CentOS当作竞争对手?
- mysql jooyoo net_.net连接MySQL的方法
- 解决linux下终端无法输入的假死问题