Log4j2配置:实现Logback totalSizeCap式的日志滚动删除
Log4j2 配置问题:实现Logback totalSizeCap等效功能
因为Logback的Syslog Appender不支持RFC5424格式,我已经迁移到Log4j2,需要实现和Logback中totalSizeCap一样的功能:
- 日志文件达到100MB时滚动压缩
- 保留7天历史日志
- 总日志大小超过3GB时自动删除旧日志
但当前我的Log4j2配置无法生效,附上Logback的参考配置和我自己的Log4j2配置,请求协助解决。
Logback参考配置
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- roll over daily and when the file reaches 100 MB, max of 7 days or 3GB threshold --> <fileNamePattern>/data/storage/log/cms.%d{yyyy-MM-dd}.%i.Logs.gz</fileNamePattern> <maxFileSize>100MB</maxFileSize> <maxHistory>7</maxHistory> <totalSizeCap>3GB</totalSizeCap> </rollingPolicy>
我的Log4j2配置
<RollingFile name="RollingFile" fileName="/data/storage/log/cms.log" filePattern="/data/storage/log/cms.%d{yyyy-MM-dd}.%i.Logs.gz"> <PatternLayout pattern="${LOG_PATTERN}" /> <Policies> <SizeBasedTriggeringPolicy size="100 MB" /> <TimeBasedTriggeringPolicy /> </Policies> <DefaultRolloverStrategy max ="100" totalSizeCap="3GB"> <Delete basePath="/data/storage/log/" maxDepth="2"> <IfFileName glob="*/cms*.Logs.gz" /> <IfLastModified age="P7D" /> </Delete> </DefaultRolloverStrategy> </RollingFile> <Syslog name="Syslog" format="RFC5424" host="127.0.0.1" port="514" protocol="UDP" appName="CMS" enterpriseNumber="25979" facility="LOCAL0" />
问题分析与修正配置
你的Log4j2配置存在几个关键问题,导致预期的日志清理逻辑未生效:
totalSizeCap的用法错误:Log4j2中DefaultRolloverStrategy的totalSizeCap不会直接触发删除,需要结合Delete策略的IfAccumulatedFileSize条件实现总容量限制。IfFileName的glob路径错误:basePath已经指定为/data/storage/log/,glob无需添加*/,否则会匹配子目录下的文件,而你的日志都在根目录下。- 时间滚动逻辑不明确:
TimeBasedTriggeringPolicy建议显式配置interval和modulate,确保每日滚动对齐自然时间边界。 - 删除逻辑为“与”条件:原配置中
IfFileName和IfLastModified是逻辑与,只有同时满足才删除,但我们需要的是“超过7天 或 总容量超3GB”的或条件。
修正后的配置如下:
<RollingFile name="RollingFile" fileName="/data/storage/log/cms.log" filePattern="/data/storage/log/cms.%d{yyyy-MM-dd}.%i.Logs.gz"> <PatternLayout pattern="${LOG_PATTERN}" /> <Policies> <!-- 100MB时触发滚动压缩 --> <SizeBasedTriggeringPolicy size="100 MB" /> <!-- 每日滚动,对齐到自然时间边界(如午夜) --> <TimeBasedTriggeringPolicy interval="1" modulate="true" /> </Policies> <DefaultRolloverStrategy max="100"> <Delete basePath="/data/storage/log/" maxDepth="1"> <!-- 匹配目标日志文件 --> <IfFileName glob="cms*.Logs.gz" /> <!-- 满足任一条件即删除:超过7天 或 总累计大小超3GB --> <IfAny> <IfLastModified age="P7D" /> <IfAccumulatedFileSize exceeds="3GB" /> </IfAny> </Delete> </DefaultRolloverStrategy> </RollingFile> <Syslog name="Syslog" format="RFC5424" host="127.0.0.1" port="514" protocol="UDP" appName="CMS" enterpriseNumber="25979" facility="LOCAL0" />
关键说明
IfAny逻辑:实现和Logback一致的“双阈值”清理规则,只要日志超过7天或总容量突破3GB,就自动删除旧文件。maxDepth="1":仅检查basePath下的直接文件,避免不必要的子目录遍历。modulate="true":让时间滚动触发点对齐到自然时间(比如每天午夜),和Logback的滚动行为保持一致。
内容的提问来源于stack exchange,提问作者manjosh
相关产品推荐
相关产品推荐

