Страница руководства logrotate
Говорит, что:
It can be used when some program cannot be told to close its logfile
and thus might continue writing to the previous log file for some
time.
Меня это смущает. Если программе нельзя приказать закрыть файл журнала, она продолжит запись навсегда, не для когда-то. Если сжатие откладывается до следующего цикла вращения, программа продолжает запись в этот файл даже после следующего цикла вращения. Как откладываешь решение проблемы?
Насколько я понимаю, copytruncate
следует использовать, когда программе нельзя приказать закрыть файл журнала. Я знаю, что некоторые данные, записанные в файл журнала, теряются во время копирования.
Я смотрел файл logrotate для couchdb, и в нем были copytruncate
и delaycompress
параметры.
/usr/local/couchdb-1.0.1/var/log/couchdb/*.log {
weekly
rotate 10
copytruncate
delaycompress
compress
notifempty
missingok
}
Похоже, нет смысла использовать delaycompress
когда copytruncate
уже есть. Что мне не хватает?
Ваше понимание copytruncate
правильно, но формулировка на странице руководства для delaycompress
немного вводит в заблуждение. Точнее, он должен сказать «когда некоторая программа не может быть немедленно закрыть его файл журнала »- например, если вы используете общие сценарии, и сценарий отправляет сигнал процессу, используя журнал, когда все файлы журнала были повернуты.
Не уверен, что я полностью понимаю ваш вопрос, но если вы спрашиваете, что я думаю ... Я использую это:
postrotate
killall -HUP syslog-ng
endscript
Это хороший (или, по крайней мере,) способ убить журнал и перейти к следующему. Для «отстойных» программ, таких как платформа Cisco ASA, регистрирующая тонны данных в секунду, это работает.
Мы используем:
Это создает фиксированную копию apache access_log
access_log.1
чтобы в конце дня мы могли запустить наш пакет Stats как скрипт.
На следующий день logrotate сжимает файл, создавая access_log.2.zip