Logging
如何獲取 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 使用日期偏移量——或者更好的是,找出上一個時間段?
在 3.8.0 中添加(雖然看 svn 歷史,但看起來它實際上是在 3.7.9 中添加的):
http://svn.fedorahosted.org/svn/logrotate/tags/r3-8-0/CHANGES
- added "dateyesterday" option (see man page)
如果您的發行版中的 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 LOGFILE in $@”循環中。
- 序列’ -$$ 0-9 $$$$ 0-9 $$$$ 0-9 $$$$ 0-9 $$$$ 0-9 $$$$ 0-9 $$$$ 0-9 $$$$ 0-9 $$’ 是 logrotate 的預設 glob 模式,請參閱 logrotate man 的dateext選項的描述。