Я работаю над Ubuntu 14 с утилитой rsyslog и logrotate по умолчанию.
В /etc/logrotate.d/rsyslog
конфигурации rsyslog по умолчанию logrotate я вижу следующее:
/var/log/syslog
{
rotate 7
daily
missingok
notifempty
delaycompress
compress
postrotate
reload rsyslog >/dev/null 2>&1 || true
endscript
}
Из того, что я понимаю, рекомендуется использовать copytruncate во всех сценариях logrotate, поскольку он не перемещает текущий журнал, а скорее обрезает журнал, чтобы любой процесс с обработчиком открытого файла мог продолжать запись в него.
Так почему же конфигурация по умолчанию использует функцию перезагрузки rsyslog?
Говоря как автор rsyslog, copytruncate на самом деле очень, очень, очень плохой выбор. Это по своей природе очень редко, и его использование почти гарантирует, что вы потеряете данные журнала. Чем чаще будет записан файл, тем больше вы потеряете. И это не только часть последней строки, но может быть несколько сотен, в зависимости от точного времени и состояния системы на момент вращения.
Когда файл перемещается и создается новый индекс (файл), rsyslog отслеживает предыдущий файл и завершает обработку. Таким образом, у вас нет никаких потерь в этом случае. Гарантировано (кроме случаев, если вы размонтируете файловую систему ...).
На "reopenOnTruncate": лично я видел reopenOnTruncate, чтобы быть в ярости и в других отношениях, особенно с NFS и тому подобное. Некоторое время назад я полностью удалил эту функциональность, но позже убедил объединить аналогичную функциональность обратно. Она останется «экспериментальной», скорее всего, навсегда, так как я действительно знаю, что люди сталкиваются с проблемами в очень сильно загруженных системах. «copytruncate» - это просто не приличный режим для работы с файлами журналов.
В настоящее время я работаю над рефакторингом imfile (ETA 8.34 или 8.35). Реорганизованная версия, вероятно, сможет предотвратить случайную повторную отправку из-за гонки API, но также не сможет защитить от потери данных - потому что это концептуально невозможно.
источник
Это полностью зависит от того, как процесс пишет логи.
copytruncate
только работает, если сообщения журнала добавляются в файл (напримерwhatever >> logfile
.И не тогда , когда он перенаправляет вывод (например
whatever > logfile
).источник
Начиная с версии 8.16, rsyslog имеет опцию imfile,
reopenOnTruncate
которая обрабатывает проблему copytruncte.источник
В частности, для rsyslog имеет смысл оставить все как есть.
Основная причина в том, что rsyslog имеет внутренние очереди, которые он может использовать в тех случаях, когда его выходной дескриптор становится недоступным.
Перезагрузка а) заставит rsyslog воссоздать свой собственный файл журнала и б) приведет к тому, что любые события в очереди будут сброшены в файл при создании.
Это может быть copytruncate не причиняет вреда (хотя я был бы обеспокоен укорочением частично написанных строк), но я склонен думать, что копирование / удаление / перезагрузка «безопаснее» с точки зрения целостности.
Как уже упоминалось @ faker , поскольку rsyslog может справиться с ситуацией, когда его файл становится недоступным, нет веских причин использовать copytruncate.
И, как упомянул @ SelivanovPavel , rsyslog на самом деле требует определенной конфигурации, чтобы правильно обрабатывать усечение копирования.
Так что хотя бы потому, что использование
reload
подхода требует меньшего отклонения от конфигурации по умолчанию, я бы сохранил его.источник