如何解决使用DefaultRolloverStrategy无法删除log4j2日志
我正在使用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>
<OnStartupTriggeringPolicy/>
实际上在启动时触发了我的DefaultRolloverStrategy
,但是符合条件的文件却为空:
因此,不会删除任何日志,但是我相当有信心我的配置正确。我缺少什么吗?如果我的日志文件模式与它们奇怪的getEligibleFiles()
常量不匹配,为什么PATTERN_COUNTER
方法会中止?
解决方法
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设置为应该使您看到这些调用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。