Назад | Перейти на главную страницу

Как я могу заставить logrotate dateext отражать дату журнала, а не дату ротации?

Моя конфигурация Apache logrotate выглядит так:

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

Это отлично работает, за исключением того, что дата в повернутом имени файла на один период позже, чем период, фактически охваченный журналами, например error_log.2012.09 охватывает период с 01.08.2012 по 31.08.2012.

Я понимаю, что есть и другие варианты для 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. при работе с несколькими файлами заключите блок кода в "для ЛОГ-ФАЙЛ в цикле $ @ ".
  3. последовательность '- [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9]'- шаблон глобуса по умолчанию для logrotate, см. описание dateext вариант логротата человека.