我想要的是:
- 最多 10 个日志文件,总数
- 每个日志文件,大小不超过 50MB。
因此日志文件夹永远不会超过 (50MB *10 )= 500MB。
但我的 log4j2 配置似乎没有正确完成。
发生的事情是:
- 日志在 50 MB 后滚动
- 但是每天最多保留 10 个日志
- 因此日志文件夹中保存的日志文件数量没有限制(因为例如,在 2 天内,收集了 20 条 50 MB 的日志)
配置如下:
<Configuration status="WARN">
<Appenders>
<RollingFile name="RollingFile" fileName="log/my.log" filePattern="log/my-%d{MM-dd-yyyy}-%i.log">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
<Policies>
<OnStartupTriggeringPolicy />
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="50 MB"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
我做错了什么?
最佳答案
从 2.5 开始,Log4j 支持 custom Delete action在每次翻转时执行。
您可以通过以下方式控制删除哪些文件:
以上可以组合。与其仅指定大小条件以将磁盘使用量保持在最大 500MB,不如还匹配名称,这样您就不会无意中删除不相关的文件。
需要更细粒度地控制要删除的文件的用户可以使用任何受支持的 JSR-223 脚本语言指定脚本条件。
请查看documentation , 它有三个可能有用的完整示例。
对于您的问题,此代码段可能有效:
<DefaultRolloverStrategy>
<!--
* only files in the log folder, no sub folders
* only rolled over log files (name match)
* either when more than 10 matching files exist or when the max disk usage is exceeded
-->
<Delete basePath="log" maxDepth="1">
<IfFileName glob="my-??-??-????-*.log">
<IfAny>
<IfAccumulatedFileSize exceeds="500 MB" />
<IfAccumulatedFileCount exceeds="10" />
</IfAny>
</IfFileName>
</Delete>
</DefaultRolloverStrategy>
顺便说一句,请注意您可以 compress log files on rollover使它们占用更少的磁盘空间。
最后,小心!无法恢复以这种方式删除的文件。 :-)
关于java - 如何删除旧的滚动 log4j2 日志,最多保留 10 个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34692415/