如何使用 log4j2 删除旧日志

2022-09-04 07:58:34

( F.Y.I.我已经在互联网上搜索了许多文档。我使用的是 storm-0.10.0-beta1。Storm 中 log4j2 的配置文件是工作.xml )

现在,我尝试使用log4j2。

我正在寻找删除旧日志的方法,但我无法找到。部分配置如下所示。

    <RollingFile name="SERVICE_APPENDER"
             fileName="${sys:storm.home}/logs/${sys:logfile.name}.service"
             filePattern="${sys:storm.home}/logs/${sys:logfile.name}.service.%d{yyyyMMdd}">
        <PatternLayout>
            <pattern>${pattern}</pattern>
        </PatternLayout>
        <Policies>
            <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
        </Policies>
        <DefaultRolloverStrategy max="9"/>
    </RollingFile>

起初,我希望删除超过3天的日志文件。

但实际上,事实并非如此。

因此,我想知道是否有办法删除旧日志。

如果有一种方法我还没有抓住,请通知我。


答案 1

从 2.5 开始,Log4j 支持在每次滚动更新时执行的自定义删除操作

您可以通过以下任意组合来控制删除哪些文件:

  1. 名称(与 glob正则表达式匹配))
  2. 年龄(“如果 14 天或更早,则删除”)
  3. 计数(“仅保留最新的 3”)
  4. 大小(“仅保留最新的文件,最大 500MB”)

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

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

对于您的问题,此代码段应该有效:

<RollingFile name="rollingFile" 
      fileName="/path/app.log"
      filePattern="/path/app.%d{yyyy-MM-dd}.log"
      ignoreExceptions="false">
. . .
      <DefaultRolloverStrategy>
        <!--
          * only files in the log folder, no sub folders
          * only rolled over log files (name match)
          * only files that are 4 days old or older
        -->
        <Delete basePath="${sys:storm.home}/logs/" maxDepth="1">
          <IfFileName glob="*.service.????????" />
          <IfLastModified age="4d" />
        </Delete>
      </DefaultRolloverStrategy>
 . . .

<RollingFile>

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


答案 2

您可以在 log4j 的此 JIRA 条目中找到更多背景信息:

https://issues.apache.org/jira/browse/LOG4J2-524

似乎情况是,当您仅使用TimeBasedTriggeringPolicy


推荐