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

Apache2 и logrotate: требуется delaycompress?

В настоящее время я смотрю на размер файлов моих журналов Apache, поскольку они стали огромными. В моей конфигурации logrotate у меня есть delaycompress включен. Действительно ли это нужно Apache (поскольку в документации logrotate сказано, что некоторые программы все еще записывают в старый файл) или безопасно ли отключить delaycompress?

Вот моя конфигурация logrotate:

/var/log/apache2/*.log {
    weekly
    missingok
    rotate 26 
    compress
    delaycompress
    notifempty
    create 640 root adm
    sharedscripts
    postrotate
            if [ -f /var/run/apache2.pid ]; then
                    /etc/init.d/apache2 restart > /dev/null
            fi
    endscript
}

Если вы выполняете перезапуск Apache (или даже «изящно»), он закроет дескрипторы открытых файлов и откроет их снова. Вам не понадобится delaycompress, потому что файл будет закрыт и снова открыт как часть вашего перезапуска postrotate.

rotate access_log -> access_log.1 (rename action, no INODE change)
apache still writing to access_log.1 (same open FD on same INODE)
apache restart (close FD, release INODE writing)
apache writing to access_log (new FD to a new INODE)

Перезагрузка - плохая идея - что, если файл конфигурации случайно изменился и больше не действителен? Ваш apache не запускается. Вместо этого отправьте HUP родительскому процессу, который сообщает ему закрыть / повторно открыть дескрипторы файлов.

postrotate
  /bin/kill -HUP `cat /var/run/apache2.pid 2>/dev/null` 2>/dev/null || true
endscript

cat завершится ошибкой, если PID отсутствует (или пуст, или недействителен), что приведет к сбою kill, поэтому вам не нужен if..then блок вокруг него.

Хм, в данном случае, наверное, так как Apache держит логи открытыми.

Вы можете попробовать rotatelogs сценарий. Это часть apache2-utils пакет, по крайней мере, здесь, на моей рабочей станции Ubuntu. Другой подход - чередовать их ежедневно, а не еженедельно, чтобы вы меньше буферизовали перед сжатием.