Spring 日志大小维护的引导 Log4j2 配置问题
Spring Boot Log4j2 configuration issue with log size maintenance
我有一个 spring 引导应用程序并使用 log4j2 生成控制台并在 centos linux 中持久保存日志 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 范围内,roll 策略有效,它正在删除文件
但是,我的磁盘 space 仍然被 space 占用。可能是什么原因?
您需要利用 RollingFileAppender 的 DeleteAction。我建议您看一下 documentation,因为有很多很好的例子。
你的行为原因如下:看你的参数
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 个文件,并且可能在您有足够 space.
的不同文件夹中
当您提供自己的 log4j2.xml
配置文件时,您将覆盖 Spring 引导默认日志记录配置,并且可以安全地假设它将是 Log4j2 使用的配置。
您的配置几乎是正确的。如果您想实现所需的行为,我建议您进行以下更改:
- 请注意,您将
Delete
操作 basePath
指向了错误的位置,它应该指向存储日志的目录。
IfFileName
glob
模式也是错误的,它应该与您的日志文件名匹配。
- 最后,您使用的是
IfLastModified
条件。顾名思义,这种情况与日志文件的最后修改日期有关,而不是它们的大小。请考虑改用 IfAccumulatedFileSize
(或者 IfAccumulatedFileCount
)。见 relevant documentation.
由于这些原因,您的日志没有被正确删除,占用的磁盘 space 大于所需数量。在不删除的情况下,您的日志文件将按照您的 SizeBasedTriggeringPolicy
配置每 1 MB
轮换一次,并将一直保留到 DefaultRolloverStrategy
、7
的 max
属性值] 默认情况下,总是达到,加上当前日志文件的数量。
总之,请尝试这样的配置:
<?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”等结尾,生成的存档将使用与后缀匹配的压缩方案进行压缩,如果需要,这可以让您为同一 space 存储更多存档。
对于您的评论,您似乎在使用大文件时遇到了问题:请看这个 bug,我认为它清楚地描述了您的问题。
我最好的建议是将日志文件的大小减小到正常工作的大小,或者尝试使用更新版本的库。
我知道您正在使用 Spring Boot 来管理您的依赖项:
请验证您的 Maven 树并查看您正在使用的实际版本库,并在必要时进行更改。
仅供面临类似问题的人参考,我只是将日志记录机制更改为 logback。它就像一个魅力,没有问题。
我使用的参考 link:spring boot with logback
我有一个 spring 引导应用程序并使用 log4j2 生成控制台并在 centos linux 中持久保存日志 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 范围内,roll 策略有效,它正在删除文件
但是,我的磁盘 space 仍然被 space 占用。可能是什么原因?
您需要利用 RollingFileAppender 的 DeleteAction。我建议您看一下 documentation,因为有很多很好的例子。
你的行为原因如下:看你的参数
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 个文件,并且可能在您有足够 space.
的不同文件夹中当您提供自己的 log4j2.xml
配置文件时,您将覆盖 Spring 引导默认日志记录配置,并且可以安全地假设它将是 Log4j2 使用的配置。
您的配置几乎是正确的。如果您想实现所需的行为,我建议您进行以下更改:
- 请注意,您将
Delete
操作basePath
指向了错误的位置,它应该指向存储日志的目录。 IfFileName
glob
模式也是错误的,它应该与您的日志文件名匹配。- 最后,您使用的是
IfLastModified
条件。顾名思义,这种情况与日志文件的最后修改日期有关,而不是它们的大小。请考虑改用IfAccumulatedFileSize
(或者IfAccumulatedFileCount
)。见 relevant documentation.
由于这些原因,您的日志没有被正确删除,占用的磁盘 space 大于所需数量。在不删除的情况下,您的日志文件将按照您的 SizeBasedTriggeringPolicy
配置每 1 MB
轮换一次,并将一直保留到 DefaultRolloverStrategy
、7
的 max
属性值] 默认情况下,总是达到,加上当前日志文件的数量。
总之,请尝试这样的配置:
<?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”等结尾,生成的存档将使用与后缀匹配的压缩方案进行压缩,如果需要,这可以让您为同一 space 存储更多存档。
对于您的评论,您似乎在使用大文件时遇到了问题:请看这个 bug,我认为它清楚地描述了您的问题。
我最好的建议是将日志文件的大小减小到正常工作的大小,或者尝试使用更新版本的库。
我知道您正在使用 Spring Boot 来管理您的依赖项: 请验证您的 Maven 树并查看您正在使用的实际版本库,并在必要时进行更改。
仅供面临类似问题的人参考,我只是将日志记录机制更改为 logback。它就像一个魅力,没有问题。
我使用的参考 link:spring boot with logback