log4j2CronTriggeringPolicy归档策略⽣成的归档⽂件名⽇期错误问题
这两天接⼿了⼀个线上服务问题,有⼀个服务采⽤的log4j2输出每天的⽤户元数据⽇志,每天00:00:00的时候对前⼀天的⽇志进⾏归档,
然后新建⼀个当天要⽤的⽇志⽂件,在线上发现了问题,⽐如昨天是2021-11-18,归档之后归档⽂件的名称却是2021-11-19,这不是我们
想要的效果,因为这个归档⽂件中实际上包含的都是2021-11-18的⽇志
我的配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>2.3.3.RELEASE</version>
</dependency>
spring-boot-starter-log4j2这个启动依赖⾥⾯包含了log4j的依赖,并且log4j的版本都是2.13.3
<RollingFile name="userMetadataTo" fileName="${log.path}userMetadataTo_${hostName}.log"
filePattern="${log.path}userMetadataTo_%d{yyyy-MM-dd}_${hostName}_%i.log">
<!--输出的⽇志数据格式-->
<PatternLayout pattern="%msg%n"/>
<!-- 每天0点⽣成新的⽇志⽂件 -->
<CronTriggeringPolicy schedule="0 0 0 * * ?"/>
</RollingFile>
可以看到,配置很简单,就是使⽤cron表达式声明每天00:00:00这个时间点的时候进⾏⽇志翻滚
如何解决
⽹上类似问题
翻了很多⽹上类似的问题,最终在apache的issue⾥⾯翻到了问题所在
issue怎么说
这个issue⾥⾯主要是说log4j定时任务运⾏的时候,有⼀个函数getTimeBefore()有问题,没有返回上⼀个周期(当前时间-配置的定时周期)
⽽是直接返回的当前时间,⽐如现在是2021-11-19 00:00:00,log4j的定时任务开始执⾏,我们配置的定时任务是每天00:00:00执⾏,所以
这个周期就是24x60x60x1000(将⼀天换算成毫秒),那么最终归档的⽂件名称就应该是2021-11-19 00:00:00的毫秒时间戳 - 24x60x60x1000,
这样就可以正确的得到2021-11-18 00:00:00这个时间,但是2.11.2这个版本的log4j最终是返回当前⽇期,所以归档的⽂件名会有错误。
issue⾥⾯的错误的版本和我的⼀致吗
issue⾥⾯有错误的版本是2.11.2,并且说明了到2.13.1的版本这个问题已经修复了,⽽我实际在spring-boot-starter-log4j2这个依赖⽤到
的是2.13.3的版本,这就很奇怪了~
依赖问题
当前实际依赖的log4j版本
于是我在pom的Dependency Analyzer了下,发现⾥⾯⽤的都是2.11.2的版本
应该依赖的log4j版本
然⽽在mavenrepository⾥⾯显⽰这个版本依赖的log4j都应该是2.13.3才对:
⽗POM害我
最终在⽗POM⾥⾯发现了⼀个配置
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-bom</artifactId>
<version>${log4j2.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
这个${log4j2.version}对应的版本刚好就是2.11.2,然后看⼀下log4j-bom是⼲啥的
log4j-bom⾥⾯管理了很多log4j相关的依赖,将这些依赖的版本都限制为2.11.2,问题到此就已经明了了,
本来呢我依赖的这个spring-boot-starter-log4j2不应该出现归档⽂件名称错误的问题
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
log4j2不打印日志<version>2.3.3.RELEASE</version>
</dependency>
但是呢刚好依赖的公司的⽗POM给覆盖成了2.11.2,然后2.11.2这个版本⼜刚好有问题,于是有了这次⽣产问题~
对⽐下2.11.2和2.13.3的log4j代码
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论