Logging

如何獲取 logrotate dateext 以反映日誌日期而不是輪換日期?

  • June 16, 2020

我的 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

筆記:

  1. 腳本僅在“每日”選項的情況下才能正常工作
  2. 如果對多個文件進行操作,請將程式碼塊包裝在“for LOGFILE in $@”循環中。
  3. 序列’ -$$ 0-9 $$$$ 0-9 $$$$ 0-9 $$$$ 0-9 $$$$ 0-9 $$$$ 0-9 $$$$ 0-9 $$$$ 0-9 $$’ 是 logrotate 的預設 glob 模式,請參閱 logrotate man 的dateext選項的描述。

引用自:https://serverfault.com/questions/439531