如何删除旧版的log4j2日志,最多可保存10个文件?

时间:2016-01-09 10:36:29

标签: java logging log4j log4j2 rollingfileappender

我想要的是:

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

因此,logs文件夹永远不会增长(50MB * 10)= 500MB。

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

发生的事情是:

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

这是配置:

<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>

我做错了什么?

2 个答案:

答案 0 :(得分:5)

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

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

  1. 姓名(匹配globregex
  2. Age(“如果14天或更长时间删除”)
  3. 计数(“只保留最近的3”)
  4. 大小(“仅保留最近500MB的文件”)
  5. 以上可以合并。而不是仅指定大小条件以将磁盘使用率降至最大500MB,最好也匹配名称,以免您无意中删除不相关的文件。

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

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

    对于您的问题,此代码段可能有效:

      <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使它们占用更少的磁盘空间。

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

答案 1 :(得分:1)

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

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