当前位置: 首页 > 知识库问答 >
问题:

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

羊舌新荣
2023-03-14

我有一个Spring Boot应用程序,并使用log4j2在centos linux中生成控制台和持久化日志。

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

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

因此,我的磁盘已满,这导致了一个问题。

蛮力方法的解决方案是:每当重新启动(硬停止和启动)我的spring boot应用程序时,都会从wc通知中清除日志。出来

我的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的范围内,滚动策略正在工作,它正在删除文件

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

共有3个答案

司马羽
2023-03-14

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

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

您在这里要问的是,日志文件应该允许增长到1M。一旦它达到1M大小,就会复制到日志文件中。log-1和一个新文件logfile。日志已创建。当文件生成时,您需要只保留最后5个文件。旧文件会自动删除。因此,看起来行为与您配置的完全相同。您可以做的是将配置为保留5个以上的文件,并且可能保留在另一个文件夹中,在该文件夹中您有足够的空间。

常飞翼
2023-03-14

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

余天宇
2023-03-14

当您提供自己的log4j2时。默认情况下,您将使用/j2配置来覆盖日志文件。

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

  • 请注意,您的Delete操作basePath指向了错误的位置,它应该指向存储日志的目录

由于这些原因,您的日志没有被正确删除,并且占用的磁盘空间大于所需的数量。在不删除的情况下,您的日志文件将按照您的SizeBasedTriggeringPolicy配置的1MB进行旋转,并将一直保持旋转,直到默认情况下DefaultRollorOverstrategymax属性的值达到,并且始终加上当前日志文件的数量。

总之,请尝试以下配置:

<?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>

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

请小心删除操作,它不仅可以删除您的日志文件,还可以删除所有符合您的全局模式的文件。

此外,尽管可能与您的用例无关,但请注意,如果存档文件的filePattern以". gz"、". zip"、". bz2"等结尾,则将使用匹配的压缩方案对结果存档进行压缩后缀,如果需要,它可以允许您为相同的空间存储更多的档案。

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

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

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

 类似资料:
  • 我的log4j2中有此配置。xml文件: 我将此文件放在src/resources中,并遵循以下指南:guide,但当我运行项目时,出现以下错误:

  • 主要内容:1. 设置错误日志,2. 设置访问日志,3. 启用条件日志记录,4. 日志记录到Syslog本节介绍如何在NGINX中配置日志记录错误和处理的请求。在本文章中将涉及以下内容 - 设置错误日志 设置访问日志 启用条件日志记录 日志记录到Syslog 1. 设置错误日志 NGINX将遇到的不同严重性级别问题的信息写入错误日志。 指令将日志记录设置为特定文件,或,并指定要记录的消息的最低级别。 默认情况下,错误日志位于(绝对路径取决于操作系统和安装),并记录来自所指定的所有严重级别的消息。

  • 我正在用systemd-Jourald来处理小硬结 使用/etc/systemd/journald中的以下配置。形态: 但这种配置似乎并不适用。当我重新启动journald时,我会得到以下条目: 然后/run总是100%命中,日志被截断而不更新。

  • partition/data只有15G,kafka日志文件夹是-/data/var/kafka/kafka-logs data/var/kafka/kafka-logs下的大多数文件夹大小为4K-40K 但两个文件夹的大小非常大--5G-7G,这导致/数据是100%

  • Seafile 服务器有如下日志文件: seafile.log: Seafile服务器的日志 controller.log: 控制器的日志 seahub_django_request.log: Seahub的日志 seahub.log: Django 框架和电子邮件发送的日志 Ccnet Log: logs/ccnet.log (内部 RPC 的日志, 没有实际用处) 专业版特有日志文件: sea

  • 在传统的weblogic容器中部署spring boot web应用程序时,我遇到了一些与日志相关的异常。同一个应用程序在嵌入式tomcat上运行良好,无需对其进行任何更改。 对于weblogic 12 c,我看到了一个例外: ulticaster.java:98Aorg.springframework.boot.context.event.InstanceOf(Aistener.publish)