【问题标题】:How to delete older rolled over log4j2 logs, keeping up to 10 files?如何删除旧的翻转 log4j2 日志,最多保留 10 个文件?
【发布时间】:2016-04-14 01:02:04
【问题描述】:

我想要的是:

  • 最多 10 个日志文件,总计
  • 每个日志文件,大小不超过 50MB。

因此,日志文件夹永远不会超过 (50MB *10 )= 500MB。

但我的 log4j2 配置似乎没有正确完成。

正在发生的事情是:

  • 日志会在 50 MB 后翻转
  • 但是每天最多保留 10 条日志
  • 因此日志文件夹中保存的日志文件数量没有限制(例如,在 2 天内,收集了 20 个 50mb 的日志)

这里是配置:

<Configuration status="WARN">
    <Appenders>
        <RollingFile name="RollingFile" fileName="log/my.log" filePattern="log/my-%d{MM-dd-yyyy}-%i.log">
          <PatternLayout>
                <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
          </PatternLayout>
          <Policies>
                <OnStartupTriggeringPolicy />
                <TimeBasedTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="50 MB"/>
          </Policies>
          <DefaultRolloverStrategy max="10"/>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="RollingFile"/>
        </Root>
    </Loggers>
</Configuration>

我做错了什么?

【问题讨论】:

    标签: java logging log4j log4j2 rollingfileappender


    【解决方案1】:

    从 2.5 开始,Log4j 支持在每次翻转时执行的 custom Delete action

    您可以通过以下方式控制删除哪些文件:

    1. 名称(匹配 globregex
    2. Age(“如果超过 14 天就删除”)
    3. 计数(“只保留最近的 3 个”)
    4. 大小(“仅保留最新的文件,最大为 500MB”)

    以上可以组合。与其仅指定大小条件以将磁盘使用量降至最大 500MB,不如同时匹配名称,这样您就不会无意中删除不相关的文件。

    需要更细粒度地控制要删除哪些文件的用户可以使用任何受支持的 JSR-223 脚本语言指定脚本条件。

    请查看documentation,它包含三个可能有用的完整示例。

    对于你的问题,这个 sn-p 可能有效:

      <DefaultRolloverStrategy>
        <!--
          * only files in the log folder, no sub folders
          * only rolled over log files (name match)
          * either when more than 10 matching files exist or when the max disk usage is exceeded
        -->
        <Delete basePath="log" maxDepth="1">
          <IfFileName glob="my-??-??-????-*.log">
            <IfAny>
              <IfAccumulatedFileSize exceeds="500 MB" />
              <IfAccumulatedFileCount exceeds="10" />
            </IfAny>
          </IfFileName>
        </Delete>
      </DefaultRolloverStrategy>
    

    顺便说一句,请注意您可以compress log files on rollover 使它们占用更少的磁盘空间。

    最后,小心!无法恢复以这种方式删除的文件。 :-)

    【讨论】:

    • 在 log4j 2.1 中有什么办法吗?
    • 不是 Log4j 函数。您需要编写脚本来删除操作系统中的旧日志...
    • 我强烈建议升级。有什么不能升级的原因吗?
    • 唯一的原因是得到我经理的批准 :)。无论如何我升级到2.7。谢谢
    【解决方案2】:

    TimeBasedTriggeringPolicy 基于filePattern 工作。基本上,文件模式 (%d) 中的最小时间单位是触发时间间隔。在您的情况下,该值为“dd”,因此每天都会触发该政策。

    filePattern 中的 %i 会在一天内保留多个日志文件。 我建议尝试在 filePattern 中不使用 %i

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-06
      • 2011-02-09
      • 1970-01-01
      相关资源
      最近更新 更多