Когда использовать параметр delaycompress в logrotate?

33

Страница руководства 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уже есть. Что мне не хватает?

Ананд Читипоту
источник

Ответы:

27

Ваше понимание copytruncateправильное, но формулировка на странице руководства delaycompressнемного вводит в заблуждение. Более правильно, он должен сказать «когда какая-то программа не может сказать, чтобы немедленно закрыть ее файл журнала» - например, если вы используете sharedscripts, и сценарий отправляет сигнал процессу, используя журнал, когда все файлы журнала были повернуты ,

romble
источник
1
Когда я использую copytruncate, нет необходимости указывать программе закрыть ее файл журнала. Так что бессмысленно указывать delaycompressвместе с copytruncate?
Ананд Читипоту
6
Никогда не используйте, copytruncateесли вам абсолютно не нужно, потому что он теряет записи журнала. Вы можете использовать оба варианта, если вам нужна другая функция, которая delaycompressпредоставляет - возможность читать предыдущий файл журнала без необходимости сначала распаковывать его.
womble
Есть ли другой вариант, кроме как, copytruncateесли я не могу сказать, чтобы моя программа перезагрузилась?
Ананд Читипоту
5
Нет. Вот почему вы должны использовать программное обеспечение, которое не сосет, и которое примет сигнал, чтобы сказать «перезагрузить ваши журналы».
Вомбл
3

Не уверен, что я полностью понимаю ваш вопрос, но если вы спрашиваете, что я думаю ... Я использую это:

postrotate
          killall -HUP syslog-ng
  endscript

Это хороший (или по крайней мере) способ убить журнал и перейти к следующему. Для «отстойных» программ, таких как платформа Cisco ASA, которая регистрирует тонны данных в секунду, это работает.

кроличий садок
источник
3

Мы используем:

  • повседневная
  • delaycompress
  • nodateext

Это создает фиксированную копию apache, access_log access_log.1чтобы мы могли в конце дня запустить наш пакет Stats как скрипт.

На следующий день logrotate сжимает файл, создавая access_log.2.zip

Edwardg
источник