You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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配置存在几个关键问题,导致预期的日志清理逻辑未生效:

  1. totalSizeCap的用法错误:Log4j2中DefaultRolloverStrategy的totalSizeCap不会直接触发删除,需要结合Delete策略的IfAccumulatedFileSize条件实现总容量限制。
  2. IfFileName的glob路径错误:basePath已经指定为/data/storage/log/,glob无需添加*/,否则会匹配子目录下的文件,而你的日志都在根目录下。
  3. 时间滚动逻辑不明确:TimeBasedTriggeringPolicy建议显式配置interval和modulate,确保每日滚动对齐自然时间边界。
  4. 删除逻辑为“与”条件:原配置中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 21:15:32