java - 如何配置 Log4j2 以快速滚动日志文件?
问题描述
我有一些日志文件,我想每天滚动并归档到 gzip 中。
相关配置如下所示:
<Appenders>
<RollingFile name="MyLog"
fileName="${sys:log.dir}/mylog.log"
filePattern="${sys:log.dir}/mylog-%d{yyyy-MM-dd}.log.gz">
<PatternLayout pattern="%d %p | %m | %c{1.} [%t]%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="MyLog"/>
</Root>
</Loggers>
所以日志目录可能看起来像
mylog-2020-01-01.log.gz
mylog-2020-01-02.log.gz
mylog-2020-01-03.log.gz
mylog.log // todays logs (let's say its the 4th Jan)
这工作正常,除了日志文件在一天结束时没有急切地压缩,只要附加第二天的第一个日志语句,它就会延迟压缩。
由于我正在记录的内容的性质(与客户端会话相关),这可能要到午夜之后才会发生。可能是几个小时,甚至几天。
ls
能够找到我感兴趣的日期的日志目录中的文件会很方便。目前,我不能可靠地做到这一点,因为昨天的日志可能还没有滚动;在那种情况下mylog.log
,不是今天的日志,而是昨天的日志。
有没有办法配置它,以便它会急切地滚动文件,而不是懒惰?
我可以添加一个 cronjob 来进行清理,但我很犹豫,因为如果在午夜左右进行日志记录,我不想弄乱 log4j 试图写入的文件。似乎很容易出错。
解决方案
看起来问题是TimeBasedTriggeringPolicy
一旦日期/时间模式不再适用于活动文件,
TimeBasedTriggeringPolicy
就会导致翻转
似乎基于 cron 的策略对我有用
触发器基于
CronTriggeringPolicy
cron 表达式翻转。此策略由计时器控制,并且与处理日志事件异步,因此上一个或下一个时间段的日志事件可能出现在日志文件的开头或结尾
每天午夜执行:
<Policies>
<CronTriggeringPolicy schedule="0 0 0 * * *"/>
</Policies>
推荐阅读
- javascript - Google App Script - 在 2 个电子表格之间导入所有范围格式
- node.js - 如何在 nodejs 中生成具有未知命令类型的进程?
- c# - 如何使用 Caliburn Micro 设计 ShellView?
- java-8 - jaxb-runtime-2.3.0 java.lang.NumberFormatException:不是│数字:未定义
- android - Flutter:如何让外部应用程序打开文件(如Android的隐式意图)?
- webgl - 如何从程序中获取顶点着色器
- sql - VBA SQL 哪里是 NULL
- c# - 在 Visual Studio 2008 的 C# 代码中使用 Web 引用
- python - 从两个日期列中查找日期
- python - 如何过滤掉具有特定和不同值的数据框中的条目?