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.log
logs/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.log
logs/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进阶使用(更多高级特性)的更多相关文章
- Python进阶:全面解读高级特性之切片!
导读:切片系列文章连续写了三篇,本文是对它们做的汇总.为什么要把序列文章合并呢?在此说明一下,本文绝不是简单地将它们做了合并,主要是修正了一些严重的错误(如自定义序列切片的部分),还对行文结构与章节衔 ...
- Redis进阶实践之五Redis的高级特性(转载 5)
Redis进阶实践之五Redis的高级特性 一.引言 上一篇文章写了Redis的特征,使用场景,同时也介绍了Redis的基本数据类型,redis的数据类型是操作redis的基础,这个必须好好的掌握.今 ...
- Redis进阶实践之五Redis的高级特性
一.引言 上一篇文章写了Redis的特征,使用场景,同时也介绍了Redis的基本数据类型,redis的数据类型是操作redis的基础,这个必须好好的掌握.今天我们开始介绍一些Redis的高级特性 ...
- 你应该知道的Vue高级特性
本文使用的Vue版本:2.6.10 Vue为我们提供了很多高级特性,学习和掌握它们有助于提高你的代码水平. 一.watch进阶 从我们刚开始学习Vue的时候,对于侦听属性,都是简单地如下面一般使用: ...
- Visual Studio 2015 速递(4)——高级特性之移动开发
系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 Visual Studio 2015速递(2)——提升效率和质量(VS2015核心竞争力) Visual Studi ...
- mysql笔记04 MySQL高级特性
MySQL高级特性 1. 分区表:分区表是一种粗粒度的.简易的索引策略,适用于大数据量的过滤场景.最适合的场景是,在没有合适的索引时,对几个分区进行全表扫描,或者是只有一个分区和索引是热点,而且这个分 ...
- (十二)boost库之多线程高级特性
(十二)boost库之多线程高级特性 很多时候,线程不仅仅是执行一些耗时操作,可能我们还需要得到线程的返回值,一般的处理方法就是定义一个全局状态变量,不断轮训状态,就如我目前维护的一个项目,全局变量定 ...
- (升级版)Spark从入门到精通(Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端)
本课程主要讲解目前大数据领域最热门.最火爆.最有前景的技术——Spark.在本课程中,会从浅入深,基于大量案例实战,深度剖析和讲解Spark,并且会包含完全从企业真实复杂业务需求中抽取出的案例实战.课 ...
- 使用Mockito进行单元测试【2】—— stub 和 高级特性[转]
一篇中介绍了Mockito的基本信息,现在接着介绍Mockito强大的stub功能 2. Mockito使用实例 5. 对连续的调用进行不同的返回 (iterator-style stubbing) ...
随机推荐
- [学习总结]9、Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)
这个图片异步加载并缓存的类已经被很多开发者所使用,是最常用的几个开源库之一,主流的应用,随便反编译几个火的项目,都可以见到它的身影. 可是有的人并不知道如何去使用这库如何进行配置,网上查到的信息对于刚 ...
- Vue API 3 (模板语法 ,指令)
条件 v-if v-if 指令用于条件性地渲染一块内容.这块内容只会在指令的表达式返回 truthy 值的时候被渲染. v-show v-show 指令也是用于根据条件展示一块内容.v-show 只是 ...
- Springboot整合MongoDB(Eclipse版本)
IDEA版本其实也差不多的,大同小异 简单Demo地址: https://blog.csdn.net/shirukai/article/details/82152243 Springboot项目整合M ...
- CSS伪类选择器实现三角形
使用css实现常用的三角效果 项目中三角: .breadcrumb{ height: 40px; line-height: 40px; padding: 0 20px; border-top: 1px ...
- Charles ios设备抓包
在Mac下做开发,用Fiddler抓包由于离不开Windows比较痛苦,还好有Charles,到官网http://www.charlesproxy.com/可下载到最新版本(若不支持rMBP可拖到Re ...
- [BUUCTF]PWN——0ctf_2017_babyheap
0ctf_2017_babyheap 附件 步骤: 例行检查,64位程序,保护全开 本地试运行一下,看看大概的情况,经典的堆题的菜单 main函数 add() edit() delete() show ...
- Python学习问题汇总
个人Python学习过程中遇到问题汇总,不断更新. 一.读取文件是报FileNotFoundError: 前期了解:python是在当前执行文件所在的目录中查找文件. 解决方法: 1.查看输入文件名是 ...
- Python基础入门(7)- Python异常处理机制
1.初识异常 1.1.什么是异常与异常处理 异常就是错误 异常会导致程序崩溃并停止运行 能监控并捕获异常,将异常部位的程序进行修理使得程序继续正常运行 1.2.异常的语法 1 # coding:utf ...
- CF513B1 Permutations 题解
Content 给定两个整数 \(n,m\).定义 \(f(p)=\sum\limits_{l=1}^n\sum\limits_{r=l}^n\min\limits_{i=l}^rp_i\),其中 \ ...
- LuoguP7534 [COCI2016-2017#4] Kartomat 题解
Content 火车站里头有一个售票机,其键盘可以看作是一个 \(4\times 8\) 的矩阵,其中第一行的前面三个键和最后一行的最后三个键都是 *,剩余的键按照从上到下,从左到右的顺序依次按照 A ...