Apache2 и logrotate: требуется задержка сжатия?

8

В настоящее время я смотрю на размер файлов моих журналов 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
}
j0nes
источник

Ответы:

7

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

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)

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

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

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

Мартейн Хеемельс
источник
YMMV, но я нахожу это хорошим ответом
asdmin
0

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

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

McJeff
источник
Вероятно, следовало добавить мою конфигурацию logrotate в приведенном выше вопросе - в качестве постротации я настроил перезапуск apache2.
j0nes