java - Spring Boot Log4j2 配置日志大小维护问题

标签 java spring-boot maven log4j2

我有一个 Spring Boot 应用程序,并使用 log4j2 生成控制台并将日志保留在 centos linux 中。

我只想在存档中保留 5mb 日志文件。

但问题是,我的归档日志文件总共有 5mb。但我的主控制台日志保存在主日志文件中,即 wc-notification.out 超过 1mb。

所以我的磁盘已满并导致出现问题。

暴力法解决方案是: 每当重新启动(硬停止和启动)我的 Spring Boot 应用程序时,日志都会从 wc-notification.out 中清除。

我的 log4j2 配置 xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO" monitorInterval="30">
    <Properties>
        <Property name="LOG_PATTERN">
            [ %d{yyyy-MMM-dd HH:mm:ss a} ] - [%t] %-5level %logger{36} - %msg%n
        </Property>
    </Properties>
    <Appenders>
        <Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </Console>
        <RollingFile name="FileAppender" fileName="/home/ec2-user/apps/wc-notification-service/wc-notification.out"
                     filePattern="/home/ec2-user/apps/wc-notification-service/archives_test/wc-notification.out-%d{yyyy-MM-dd}-%i">
            <PatternLayout>
                <Pattern>${LOG_PATTERN}</Pattern>
            </PatternLayout>
            <Policies>
                <SizeBasedTriggeringPolicy size="1MB" />
            </Policies>
            <DefaultRolloverStrategy>
                <Delete basePath="logs" maxDepth="1">
                    <IfFileName glob="wc-notification.out-*.log" />
                    <IfLastModified age="1m" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="info">
            <!--<AppenderRef ref="ConsoleAppender" /> -->
            <AppenderRef ref="FileAppender" />
        </Root>
    </Loggers>
</Configuration>

不知何故,文件在1mb范围内,并且滚动策略正在工作,正在删除文件

但是,我的磁盘空间仍然被该空间占用。可能是什么原因?

最佳答案

由于您提供自己的 log4j2.xml 配置文件,因此您将覆盖 Spring Boot 默认日志记录配置,并且可以安全地假设它将是 Log4j2 使用的配置。

您的配置几乎是正确的。如果您想实现所需的行为,我建议您进行以下更改:

  • 请注意,您将 Delete 操作 basePath 指向了错误的位置,它应该指向存储日志的目录。
  • IfFileName glob 模式也是错误的,它应该与您的日志文件名匹配。
  • 最后,您使用的是 IfLastModified 条件。顾名思义,这种情况与日志文件的最后修改日期有关,而不是与它们的大小有关。请考虑改用 IfAccumulatedFileSize (或者可能是 IfAccumulatedFileCount)。请参阅relevant documentation .

由于这些原因,您的日志没有被正确删除,并且占用的磁盘空间大于所需的量。如果不删除,您的日志文件将按照您的 SizeBasedTriggeringPolicy 配置每 1 MB 轮换一次,并将一直保留到 max 属性的值达到DefaultRolloverStrategy,默认情况下 7 始终会达到,加上当前日志文件的数量。

总而言之,请尝试这样的配置:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO" monitorInterval="30">
    <Properties>
        <Property name="LOG_PATTERN">
            [ %d{yyyy-MMM-dd HH:mm:ss a} ] - [%t] %-5level %logger{36} - %msg%n
        </Property>
    </Properties>
    <Appenders>
        <Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </Console>
        <RollingFile name="FileAppender" fileName="/home/ec2-user/apps/wc-notification-service/wc-notification.out"
                     filePattern="/home/ec2-user/apps/wc-notification-service/wc-notification.out-%d{yyyy-MM-dd}-%i">
            <PatternLayout>
                <Pattern>${LOG_PATTERN}</Pattern>
            </PatternLayout>
            <Policies>
                <SizeBasedTriggeringPolicy size="1MB" />
            </Policies>
            <DefaultRolloverStrategy>
                <Delete basePath="/home/ec2-user/apps/wc-notification-service">
                    <IfFileName glob="wc-notification.out-*" />
                    <IfAccumulatedFileSize exceeds="5 MB" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="info">
            <!--<AppenderRef ref="ConsoleAppender" /> -->
            <AppenderRef ref="FileAppender" />
        </Root>
    </Loggers>
</Configuration>

该解决方案依赖于将所有日志存储在同一位置。它将影响您的 RollingFile filePattern 属性。

请小心删除操作,它不仅会删除您的日志文件,还会删除所有与您的 glob 模式匹配的文件。

此外,尽管可能与您的用例无关,但请注意,如果存档文件的 filePattern 以“.gz”、“.zip”、“.bz2”等结尾,生成的存档将使用与后缀匹配的压缩方案进行压缩,这可以让您在需要时在相同空间存储更多存档。

对于您的评论,您在使用大文件大小时似乎遇到了问题:请参阅此 bug ,我认为这清楚地描述了您的问题。

我最好的建议是将日志文件的大小减小到可以正常工作的大小,或者尝试更新版本的库。

我知道您正在使用 Spring Boot 来管理您的依赖项: 请验证您的 Maven 树并查看您正在使用的实际版本库,并在必要时进行更改。

关于java - Spring Boot Log4j2 配置日志大小维护问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66649344/

相关文章:

java - 访问 Java[Maven] 项目中的资源

java - 为什么卡片布局键作为对象传递?

java - 匹配字符串中的子集

java - 应用程序关闭/重新启动时如何关闭 db4o 连接?

java - 在STS中使用带有spring boot的jaxb2 maven插件时收到错误

java - @RequiredArgsConstructor 不生成构造函数

java - 无法找到请求目标的有效认证路径 - 链接到 github

java - 如何知道javascript代码是否已经在Selenium Java中执行?

java - 使用 feign 形成多部分文件

java - maven问题,远程仓库不可用