【问题标题】:Deleting log4j2 logs with DefaultRolloverStrategy not working使用 DefaultRolloverStrategy 删除 log4j2 日志不起作用
【发布时间】:2020-08-31 14:41:22
【问题描述】:

我正在使用log4j2 版本2.13.3,我正在尝试删除应用程序启动时的旧日志。我尝试了各种示例,但它们甚至没有触发我的DefaultRolloverStrategy。我实现了这样的配置:

<properties>
    <property name="filePattern">${date:yyyy-MM-dd}</property>
    <Property name="baseDirectory">logs</Property>
</properties>

<Appenders>
<!-- ... -->
<RollingFile name="RollingFile" append="true" fileName="${baseDirectory}/${filePattern}.log"
         filePattern="${baseDirectory}/%d{yyyy-MM-dd}.log">
<PatternLayout>
    <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
<Policies>
    <OnStartupTriggeringPolicy/>
</Policies>
<DefaultRolloverStrategy>
    <Delete basePath="${baseDirectory}" maxDepth="1">
        <IfFileName glob="*.log"/>
        <IfLastModified age="10d"/>
    </Delete>
</DefaultRolloverStrategy>
</RollingFile>
</Appenders>

&lt;OnStartupTriggeringPolicy/&gt; 在启动时实际上触发了我的DefaultRolloverStrategy,但符合条件的文件却是空的:

因此,不会删除任何日志,但我相当确信我的配置是正确的。如果我的日志文件模式与其奇怪的PATTERN_COUNTER 常量不匹配,我是否遗漏了什么或者为什么getEligibleFiles() 方法会中止?

【问题讨论】:

    标签: java windows configuration log4j2


    【解决方案1】:

    getEilligleFiles 所考虑的场景是根据 DefaultRolloverStrategy 上指定的规则确定要删除哪些文件。该策略仅在当前时间模式的时间范围内删除文件。例如,如果您每小时翻转一次,它只会清除当前小时内的文件。那其实就是删除动作的由来——大部分人都想删除整个目录或目录集的文件,而不局限于当前的“窗口”。

    “奇怪的 PATTERN_COUNTER 常量”用于检查文件名中表示为 %[0]n[n...]i 的计数器。该模式导致计数器的长度固定,前导零。您没有使用 SizeBasedTriggeringPolicy,因此文件模式中没有 %i,因此它不会匹配。

    换句话说,这段代码没有做任何事情,因为它不适用于您的配置。

    查看 DefaultRolloverStrategy 时,您可以看到其构建器接受自定义操作。这些是在配置期间添加的,如果您启用了 -Dlog4j2.debug 或在 Log4j2 配置文件中的 Configuration 元素上设置了 status=DEBUG ,您应该能够看到它们。您还会注意到它们被添加到翻转方法末尾的 RolloverDescription 中。这将传递回 RollingFileManager

               if (success && descriptor.getAsynchronous() != null) {
                    LOGGER.debug("RollingFileManager executing async {}", descriptor.getAsynchronous());
                    asyncExecutor.execute(new AsyncAction(descriptor.getAsynchronous(), this));
                    releaseRequired = false;
                }
    

    翻转方法接近尾声。这将导致删除操作将在每次翻转结束时作为异步任务启动。

    同样,启用 -Dlog4j2.debug 或设置 status=Debug 应该可以让您看到这些调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-18
      • 1970-01-01
      • 1970-01-01
      • 2014-08-24
      • 2015-01-21
      • 2021-11-19
      • 1970-01-01
      • 2018-02-24
      相关资源
      最近更新 更多