Log4j2日志未按预期UTC时间滚动问题求助
解决Log4j2日志在UTC 00:00自动滚动并包含完整前一日日志的问题
要实现每天UTC 00:00自动滚动日志,且归档文件包含前一天UTC 00:00-23:59的完整日志,你需要在Log4j2配置中明确指定UTC时区,同时调整滚动触发策略的参数。以下是具体修改方案:
关键修改点
- 在
filePattern的日期格式中添加{UTC},确保归档文件名的日期基于UTC时区 - 给
TimeBasedTriggeringPolicy添加timeZone="UTC"属性,让滚动触发时间以UTC为准 - 保持
modulate="true",确保滚动时间对齐到UTC日边界
修改后的完整配置
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="INFO" packages="com.fidelis.k2.logging.filter"> <Properties> <Property name="log_path">/opt/k2/logs</Property> <Property name="log_pattern">%t - %d{yyyy-MM-dd HH:mm:ss}{UTC} %-5p %c:%L - %m%n</Property> </Properties> <Appenders> <Console name="console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> <RollingFile name="rollingFile" fileName="${log_path}/solr_data_uploader.log" filePattern="${log_path}/solr_data_uploader-%d{yyyy-MM-dd}{UTC}.log.gz"> <PatternLayout> <pattern>${log_pattern}</pattern> </PatternLayout> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true" timeUnit="days" timeZone="UTC"/> </Policies> <DefaultRolloverStrategy max="15"/> </RollingFile> </Appenders> <Loggers> <Logger name="com.fidelis.k2" level="info" additivity="false"> <AppenderRef ref="rollingFile"/> </Logger> <Root level="info"> <AppenderRef ref="console"/> </Root> </Loggers> </Configuration>
原理说明
- 时区指定:默认情况下Log4j2使用系统时区,导致滚动时间和文件名日期都基于系统时区。通过在日期格式和触发策略中明确指定
UTC,确保所有时间计算都以UTC为准。 - modulate参数:当
modulate="true"且时区为UTC时,Log4j2会将滚动触发时间对齐到UTC日的00:00点,而不是从应用启动时间开始计算间隔。 - 日志格式中的UTC:额外将
log_pattern中的日期也指定为UTC,确保日志内容中的时间戳也是UTC时间,和归档文件的时间范围完全匹配。
这样修改后,每天UTC 00:00会自动归档前一天UTC 00:00到23:59的完整日志,文件名中的日期也会对应前一天的UTC日期(例如11月21日UTC00:00生成的文件名为solr_data_uploader-202X-11-20.log.gz)。
内容的提问来源于stack exchange,提问作者Shrottam Nayan
相关产品推荐
相关产品推荐

