如何让 logrotate dateext 反映日志日期而不是轮换日期?

如何让 logrotate dateext 反映日志日期而不是轮换日期?

我的 Apache logrotate 配置如下:

/var/log/http/*log {
    monthly
    dateext
    dateformat .%Y.%m
    [... rest stripped for brevity ...]
}

这很有效,只是轮换文件名上的日期比日志实际涵盖的时间段晚一个时间段,例如error_log.2012.09涵盖 2012-08-01 至 2012-08-31。

我意识到 Apache 还有其他选项(例如 cronolog),但我还有一堆其他日志也需要轮换,除了这个问题之外,logrotate 正是我所需要的。

有没有办法让 logrotate 在生成旋转文件名时使用日期偏移量 - 或者更好的是,找出前一个时间段?

答案1

在 3.8.0 中添加(尽管查看 svn 历史记录,它看起来实际上是在 3.7.9 中添加的):

http://svn.fedorahosted.org/svn/logrotate/tags/r3-8-0/CHANGES

- added "dateyesterday" option (see man page)

答案2

如果你的 distrib 中的 logrotate 还没有 'dateyesterday' 选项,你可以使用如下脚本:

LOGFILE="$1"
LOGMTIME="$(env LC_ALL='C' stat $LOGFILE |awk '/^Modify/{print $2}')"
LOGSTART=$(( $(date +%Y%m%d -d "${LOGMTIME}") - 1 ))
mv $LOGFILE ${LOGFILE%-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]}-$LOGSTART

笔记:

  1. 脚本仅在“每日”选项下才能正常工作
  2. 如果操作多个文件,将代码块包装在“for日志档案在$@”循环中。
  3. 顺序 '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' 是 logrotate 的默认 glob 模式,请参阅日期文本logrotate man 的选项。

相关内容