logrotate 每日轮换中的高级日期

logrotate 每日轮换中的高级日期

我已经设置了一个这样的 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

相关内容