繁体   English   中英

Spring 引导 Log4j2 配置问题与日志大小维护

[英]Spring Boot Log4j2 configuration issue with log size maintenance

我有一个 spring 引导应用程序并使用 log4j2 生成控制台并将日志保存在 centos linux 中。

我只想在存档中维护5mb的日志文件。

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

所以我的磁盘已满,这会导致问题。

蛮力方法解决方案是:每当重新启动(硬停止和启动)我的 spring 启动应用程序时,从 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 引导默认日志记录配置,并且可以安全地假设它将是 Log4j2 使用的配置。

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

  • 请注意,您将Delete操作basePath指向错误的位置,它应该指向存储日志的目录。
  • IfFileName glob模式也是错误的,它应该与您的日志文件名匹配。
  • 最后,您正在使用IfLastModified条件。 顾名思义,此条件与日志文件的最后修改日期有关,与它们的大小无关。 请考虑改用IfAccumulatedFileSize (或者IfAccumulatedFileCount )。 请参阅相关文档

由于这些原因,您的日志没有被正确删除,并且占用的磁盘空间大于所需的数量。 在不删除的情况下,您的日志文件将按照SizeBasedTriggeringPolicy的配置每1 MB轮换一次,并将一直保留到达到DefaultRolloverStrategymax属性值(默认为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”等结尾,则生成的存档将使用压缩进行压缩与后缀匹配的方案,如果需要,它可以允许您在相同空间存储更多档案。

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

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

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

您需要利用 RollingFileAppender 的 DeleteAction。 我建议看一下文档,因为有很多很好的例子。

你的行为原因如下:看你的参数

appender.gateway.policies.size.size=1MB
appender.gateway.strategy.type = DefaultRolloverStrategy
appender.gateway.strategy.max = 5

你在这里问的是日志文件应该被允许增长到 1M。 一旦达到 1M 大小,它就会被复制到文件logfile.log-1并创建一个新文件logfile.log 随着文件的生成,您需要只保留最后 5 个文件。 旧文件会自动删除。 所以看起来行为与您配置的完全一样。 您可以做的是配置保留超过 5 个文件,并可能在您有足够空间的不同文件夹中。

只是为了给面临类似问题的人提供信息,我只是将我的日志记录机制更改为logback 它就像一个魅力,没有问题。

我使用的参考链接: spring boot with logback

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM