我已经设置了一个这样的 logrotate 配置文件:
/var/log/tomcat/catalina.out{
copytruncate
daily
dateext
rotate 10
missingok
notifempty
}
并且在我的 /sysconfig/cron 设置文件中,我已经设置了DAILY_TIME="00:00"
它会轮换日志,但如果日志有日期,catalina.out-20150415
它包含从 20150414 开始的日志信息,这是前一天。
我是否应该更改 /sysconfig/cron 文件中的日期,或者我可以使用 prerotate/endscript 选项来实现这一点?
据我所知,DAILY_TIME 的工作间隔为 15 分钟,我希望拥有尽可能完美的每日日志,其中只包含一天的信息。我现在得到的是什么,但文件名称中的日期与文件内容不一致。
注意:我在 SLES 下,其中每日 cron 任务与其他发行版略有不同。
答案1
除了在午夜设置每日 cronjobs 之外,我不会玩 /sysconfig/cron,而更喜欢使用 postrotate。
假设今天是 2015 年 4 月 17 日,这是轮换之后但在 postrotate 脚本运行之前的目录内容:
catalina.out-20150414
catalina.out-20150415
catalina.out-20150417
catalina.out
请注意catalina.out-20150416
缺少的内容,因为 1)轮换创建的最后一个日志文件已命名catalina.out-20150417
,并且 2)昨天创建的日志已重命名为catalina.out-20150415
以反映其内容。
这种情况允许我们使用昨天的日期对今天的日志进行“盲目重命名”,例如:
...
postrotate
mv "catalina.out-$(date +"%Y%m%d")" "catalina.out-$(date --date="yesterday" +"%Y%m%d")" > /dev/null 2>&1 || true
endscript
...
如果缺少日志文件,mv
将引发重定向到的错误消息/dev/null
,并确保正返回值|| true
答案2
也遇到了这个问题,但要注意的是,如果您使用目录和通配符作为日志名称定义的一部分(例如 /var/log/*.log)并且与多个日志文件匹配,则 postrotate 需要非硬编码日志来移动。
我发现的解决方案是 postrotate 使用 $1 作为日志名称的参数,因此您可以执行以下操作:
/var/log/mylog*.log
dateext
dateformat .%Y%m%d
...
# Content of the rotated log is from the previous day
postrotate
today=$(date +%Y%m%d)
yesterday=$(date --date="yesterday" +%Y%m%d)
mv $1.$today $1.$yesterday
endscript