log4j2 仅保留 1 个备份日志并删除其余的

问题描述 投票:0回答:1

我正在构建一个独立的 Java 应用程序,计划每天至少运行一次。我通过 xml 文件配置 log4j2 2.23.1 以指定 DefaultRolloverStrategy 和删除操作,以便它最多保留 100 个日志文件,删除超过 3 个月的备份日志文件或当备份文件夹超过 100MB 时。

相反,它会删除备份文件夹中的所有内容,然后备份前一天的日志,以便仅保留 1 个日志文件。

我想要实现的目标如下:

  1. 应每天在
    log/mystandaloneapp.log
  2. 创建一个新的日志文件
  3. 如果在同一天第二次运行应用程序,它应该将日志附加到同一个日志文件中
  4. 前一天的日志文件应备份到
    log/bak/%d{yyyy-MM}/mystandaloneapp-%d{yyyy-MM-dd}.log.gz
  5. 最多应保留 100 个日志文件
  6. 它应该删除超过 3 个月的日志文件
  7. 如果备份文件夹的大小超过100MB,应该删除日志文件

这是有问题的配置:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <RollingFile name="RollingFile" fileName="log/mystandaloneapp.log"
                     filePattern="log/bak/%d{yyyy-MM}/mystandaloneapp-%d{yyyy-MM-dd}.log.gz">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level - %msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
            </Policies>
            <DefaultRolloverStrategy max="100">
                <Delete basePath="log/bak" maxDepth="2">
                    <IfAny>
                        <IfLastModified age="P3M"/>
                        <IfAccumulatedFileSize exceeds="100MB"/>
                    </IfAny>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="RollingFile"/>
        </Root>
    </Loggers>
</Configuration>

因此,我希望每天都能在

log/bak/%d{yyyy-MM}
中找到备份的日志,但实际情况是,在新的一天,当应用程序第一次运行时,它会将每个日志文件删除到 log/bak 文件夹中,它会备份前一天的*.log并将其放入
log/bak/%d{yyyy-MM}

第二天,它将删除该文件以及 log/bak 子目录中的所有其他文件,以便仅保留 1 个备份文件,并且它始终是前一天的备份文件。

我不知道我的配置错误在哪里。

我昨天做的最后一个更改是添加 max=100 属性,但这并没有改变任何东西。一次仅保留 1 个日志文件。

这是调试日志:

2024-03-23T12:02:31.209413100Z main DEBUG Now writing to log/mystandaloneapp.log at 2024-03-23T13:02:31.209+0100
2024-03-23T12:02:31.215413Z main DEBUG AsyncLogger.ThreadNameStrategy=UNCACHED (user specified null, default is UNCACHED)
2024-03-23T12:02:31.215413Z main TRACE Using default SystemClock for timestamps.
2024-03-23T12:02:31.215413Z main DEBUG org.apache.logging.log4j.core.util.SystemClock supports precise timestamps.
2024-03-23T12:02:31.218935900Z Log4j2-TF-1-RollingFileManager-1 DEBUG Starting DeleteAction[basePath=log\bak, options=[], maxDepth=2, conditions=[IfAny[IfLastModified(age=PT3M), IfAccumulatedFileSize(exceeds=104857600)]]]
2024-03-23T12:02:31.221933800Z Log4j2-TF-1-RollingFileManager-1 DEBUG DeleteAction complete in 0.0031349 seconds
2024-03-23T12:02:31.222935200Z Log4j2-TF-1-RollingFileManager-1 TRACE Sorted paths:
2024-03-23T12:02:31.222935200Z Log4j2-TF-1-RollingFileManager-1 TRACE log\bak\2024-03\mystandaloneapp-2024-03-18.log.gz (modified: 2024-03-23T12:02:31.2164187Z)
2024-03-23T12:02:31.222935200Z Log4j2-TF-1-RollingFileManager-1 TRACE log\bak\2024-03\mystandaloneapp-2024-03-17.log.gz (modified: 2024-03-17T23:10:23.1878364Z)
2024-03-23T12:02:31.222935200Z Log4j2-TF-1-RollingFileManager-1 TRACE IfLastModified REJECTED: 2024-03\mystandaloneapp-2024-03-18.log.gz ageMillis '6' < 'PT3M'
2024-03-23T12:02:31.223934500Z Log4j2-TF-1-RollingFileManager-1 TRACE IfAccumulatedFileSize REJECTED: 2024-03\mystandaloneapp-2024-03-18.log.gz accumulated size '13760' <= thresholdBytes '104857600'
2024-03-23T12:02:31.223934500Z Log4j2-TF-1-RollingFileManager-1 TRACE Not deleting base=log\bak, relative=2024-03\mystandaloneapp-2024-03-18.log.gz
2024-03-23T12:02:31.223934500Z Log4j2-TF-1-RollingFileManager-1 TRACE IfLastModified ACCEPTED: 2024-03\mystandaloneapp-2024-03-17.log.gz ageMillis '478328036' >= 'PT3M'
2024-03-23T12:02:31.223934500Z Log4j2-TF-1-RollingFileManager-1 TRACE Deleting log\bak\2024-03\mystandaloneapp-2024-03-17.log.gz

最困扰我的是:

IfLastModified ACCEPTED: 2024-03\mystandaloneapp-2024-03-17.log.gz ageMillis '478328036' >= 'PT3M'
。该文件在几天前创建时不可能超过 3 个月。

我必须尽快解决这个问题,所以感谢您提供的任何帮助。

java logging log4j2 backup-strategies
1个回答
0
投票

我找到了解决方案这里。您似乎无法指定以月为单位的持续时间,因为它将以分钟为单位进行解释。尽管设置了

P3M
,log4j2 仍将其解释为
PT3M
,因此删除所有超过 3 分钟的日志文件。

解决方案是指定持续时间(以天为单位),因此 3 个月的正确设置是这样的:

<IfLastModified age="90D"/>
© www.soinside.com 2019 - 2024. All rights reserved.