如何使用Log4j 2.13版本生成带AM/PM标识的日志文件名
首先针对你升级到2.11版本后只生成AM时段日志的问题,我来拆解下原因和解决方案:
问题根源:时间触发策略与日志文件名模式不匹配
在Log4j 2.11中,TimeBasedTriggeringPolicy的interval参数是基于你filePattern中定义的最小时间单位来生效的。你的配置里用了%d{yyyy-MM-dd-a},这个格式对应的是“日期+AM/PM时段”,每个时段跨度是12小时,但你设置的interval="1"会被默认解析为“1小时”,这就导致触发逻辑无法正确识别AM到PM的12小时切换,自然不会生成PM时段的归档日志。
2.11版本的修复配置
修改TimeBasedTriggeringPolicy的interval为12,匹配12小时的时段跨度,同时保留modulate="true"确保滚动对齐到时段的起始时间(比如午夜和中午):
<RollingFile name="file" fileName="testAMPM.log" filePattern="testAMPM.log-%d{yyyy-MM-dd-a}" > <PatternLayout pattern="%d %5p %-120m [%t - %c:%L] %n"/> <Policies> <TimeBasedTriggeringPolicy interval="12" modulate="true" /> </Policies> </RollingFile>
另外需要注意:如果你的应用在AM时段启动,要等到中午12点之后有日志写入时,才会触发第一次滚动生成AM归档日志,同时切换到PM的活动日志;如果启动时间在PM时段,同理要等到午夜才会触发滚动。如果想立即验证,可以手动修改系统时间到下一个时段,然后写入日志测试。
Log4j 2.13版本生成带AM/PM标识日志的配置
2.13版本对时间滚动策略做了不少优化,对%a(AM/PM)的解析更精准,配置上可以更简洁:
方案1:保持12小时时段滚动
和上面的配置类似,直接使用%d{yyyy-MM-dd-a}作为归档文件名模式,搭配interval="12"的触发策略即可,逻辑和2.11修复后的一致,但滚动触发的可靠性更高。
方案2:更明确的时间格式(可选)
如果你希望归档文件名包含更具体的时间信息(比如小时),可以把filePattern改为testAMPM.log-%d{yyyy-MM-dd-hh-a},此时interval可以设为12,或者如果想每小时滚动但保留AM/PM标识,也可以设为interval="1",不过这样会生成每个小时的归档文件(比如testAMPM.log-2024-05-20-09-AM),根据你的需求选择即可。示例配置:
<RollingFile name="file" fileName="testAMPM.log" filePattern="testAMPM.log-%d{yyyy-MM-dd-hh-a}" > <PatternLayout pattern="%d %5p %-120m [%t - %c:%L] %n"/> <Policies> <TimeBasedTriggeringPolicy interval="12" modulate="true" /> </Policies> </RollingFile>
最后提醒下:不管哪个版本,都要确保Log4j的依赖包是完整的,没有混合不同版本的JAR包,避免出现兼容性问题。
内容的提问来源于stack exchange,提问作者Archana Reddy

