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