【发布时间】:2021-03-08 04:31:27
【问题描述】:
我一直在研究这个问题,我遇到了一些问题,但到目前为止还没有找到一个有相同(或什至类似)问题的问题。
问题不在于“如何配置 RollingFileAppender”。它被配置了,它实际上是在滚动。到目前为止一切顺利。
上下文是,每天,每 15 分钟,我们执行一个批处理,其中我们将输出写入两个不同的日志文件:
- 一个通用日志文件,包含所有输出
- 功能日志,仅包含与分析人员相关的那部分输出。
配置如下:
log4j.rootLogger = info, rollingFile, functionalLog
log4j.appender.rollingFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.rollingFile.File= ../logs/general_log.log
log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.ConversionPattern=%p %d %t %c - %m%n
log4j.appender.rollingFile.DatePattern='.'yyyy-MM-dd
log4j.appender.functionalLog=org.apache.log4j.DailyRollingFileAppender
log4j.appender.functionalLog.File= ../logs/functional_log.log
log4j.appender.functionalLog.layout=org.apache.log4j.PatternLayout
log4j.appender.functionalLog.layout.ConversionPattern=%m - %d%n
log4j.appender.functionalLog.filter.1=org.apache.log4j.varia.StringMatchFilter
log4j.appender.functionalLog.filter.1.StringToMatch=FUNC-LOG -
log4j.appender.functionalLog.filter.1.AcceptOnMatch=true
log4j.appender.functionalLog.filter.2=org.apache.log4j.varia.DenyAllFilter
这个配置已经工作了几个月。批处理每 15 分钟执行一次(由 crontab 触发),每晚执行两个翻转文件:
general_log.log.2020-05-18 function_log.log.2020-05-18
已创建,包含该特定日期的所有日志记录。日志很完整,我们很高兴。
几天前,我们注意到我们正在丢失日志:显然,即使第一次翻转(在午夜)成功,系统也会第二次翻转。每天上午 10.30 的批处理执行将(再次)触发(当前)日志滚动。
这导致前一天的日期文件(包含当天的所有日志)被当天前十个半小时的日志覆盖。 结果:日志在前一天的日志文件中,我们每天只有大约 10 小时的日志,而不是 24 小时。
在调查过程中,我注意到我忘记了 FunctionalLog 配置中的 DatePattern,所以我添加了这个:
log4j.appender.functionalLog.DatePattern='.'yyyy-MM-dd
现在,我知道可以将翻转设置为每年、每月、每天、每小时、每分钟……,但由于某种原因,每天(上午 10.30 点)都有一些执行会使其翻转再次。 log4j 和批处理中没有配置可以解释这一点。
部署的代码、log4j 配置和服务器的配置都没有变化。
以前有没有人遇到过这样的问题?配置中有什么我们可以做的来避免这种情况吗?
【问题讨论】:
-
所以有些事情发生了变化。 log4j 是否为日志文件使用默认的最大大小,这可能已经达到了?
-
@jr593 实际上,除了行为,以及我在发现问题后在配置中所做的更改......没有任何改变。这就是为什么我们找不到可能导致它的原因。 Afaik,没有真正的“最大尺寸”,如果有,我们还没有达到。对于同一台服务器上的其他项目,我们有 100 倍或更多大小的日志,这没有问题。一般日志(在忙碌的一天)的日志只有 +-2 到 3 mb,而功能日志则小于 200 kb
-
我以为后台使用的JRE可能更新了,但我查了一下,也不是这样。
标签: java configuration log4j