java - 日志大小维护的 Spring Boot 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
)。请参阅相关文档。
由于这些原因,您的日志没有被正确删除,并且占用的磁盘空间大于所需的数量。在不删除的情况下,您的日志文件将1 MB
按照您的配置进行轮换SizeBasedTriggeringPolicy
,并将一直保留到默认情况下达到 的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”等结尾,则生成的存档将使用压缩方案进行压缩匹配后缀,如果需要,可以让您在相同空间存储更多档案。
对于您的评论,您似乎在使用大文件大小时遇到了问题:请看这个错误,我认为这清楚地描述了您的问题。
我最好的建议是将日志文件的大小减小到可以正常工作的大小,或者尝试更新版本的库。
我知道您正在使用 Spring Boot 来管理您的依赖项:请验证您的 Maven 树并查看您正在使用的实际版本库,并在必要时进行更改。
推荐阅读
- reactjs - 部署 React 项目后的空白页面
- java - 如果我真的不需要引用的数据,我应该懒惰地定义一个 JPA ManyToOne,还是只在我的实体中映射原始 id?
- docker - hcsshim::System::CreateProcess 期间遇到错误:Windows 系统调用失败:系统找不到指定的文件。(0x2)
- javascript - 找不到模块 '../../images/Logo.png'.ts(2307) 红色错误仍在显示
- r - 使用另一列值创建新列
- delve - 如何运行直到深入研究中的某行?
- c++ - 在 C++ 中使用数据库检查的登录循环
- azure - CLI cmd 何时返回
- javascript - 为什么这些复选框在 Safari 中有效,但在 Chrome 或 Firefox 中无效?
- azure-language-understanding - 如何训练具有非常密切相关话语的 luis,应该以 2 种不同的意图进行训练