Как избежать перезагрузки apache при ротации логов?


25

Я использую logrotate, чтобы вращать журналы доступа, ошибок и перезаписи Apache. Мой конфигурационный файл выглядит так:

/apache/*log {
    compress
    dateext
    rotate 365
    size=+300M
    olddir /log/old/apache
    notifempty
    missingok
    lastaction
     /bin/apache reload
    endscript
}

Моя проблема в том, что всякий раз, когда происходит ротация, Apache должен быть перезагружен, потому что Apache больше не пишет в только что повернутый лог-файл. Есть ли способ избежать перезагрузки Apache каждый раз, когда logrotate выполняет ротацию?

Ответы:


42

Причина, по которой apache нуждается в перезагрузке, заключается в том, что, открыв файл, он получает файловый дескриптор и продолжает запись в этот файловый дескриптор. Когда вы перемещаете файл, он этого не видит, он просто продолжает писать в тот же дескриптор. Когда вы выполните перезагрузку, он снова откроет файл и получит новый дескриптор.

Чтобы избежать перезагрузки, вместо перемещения файла вы можете скопировать его и очистить старый файл. Таким образом, apache может продолжать писать в один и тот же файловый дескриптор. Это можно сделать, добавив параметр «copytruncate» в файл конфигурации logrotate, например:

/apache/*log {
    copytruncate
    compress
    dateext
    rotate 365
    size=+300M
    olddir /log/old/apache
    notifempty
    missingok
}

Спасибо за Ваш ответ. Таким образом, я думаю, когда я добавлю lastaction echo "" | /apache/*log endscriptфайловый дескриптор не "потерян"?
Арфа

3
Извините, я должен был сказать «copytruncate» вместо «copy». Тогда вам вообще не нужна штуковина. Я виню в том, что в моем стоке кофеина слишком много крови :-)
Дженни Д.

Работает как шарм :)
арфа

4
@ Осторожно, logrotateдок говорит: «Обратите внимание, что между копированием файла и его усечением очень маленький промежуток времени, поэтому некоторые данные журналов могут быть потеряны».
Тотор

Помимо вероятности потери некоторых данных, есть ли другие известные недостатки использования copytruncate?
Лео Гальегильос

5

Я рекомендую вам использовать http://cronolog.org/

Вот как я это использую:

CustomLog     "|/usr/local/sbin/cronolog -S /var/log/httpd/t3.CCC.eu-access_log -P /var/log/httpd/t3.CCC.eu-access_log.prev /var/log/httpd/t3.CCC.eu-%Y.log" combined

1
Соединение с любой внешней программой может быть проблемой, если на веб-сервер много трафика. Но это аккуратно избегает проблемы файлового дескриптора.
Дженни Д

Похоже, хорошая альтернатива. Cronolog сжимает на лету?
Арфа

Аналогичное приложение "rotatelogs" находится в пакете apache2-utils. Только будьте осторожны, чтобы не «передать» один и тот же файл журнала с разных виртуальных серверов Apache - они будут давить друг на друга.
Арье Склярук
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.