Unix logrotate указывает размер блока

1 ответ

logrotate сам по себе не поддерживает разделение повернутых журналов / с, только сжатие.

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

update : на основе вашего комментария («слишком поздно разделять файлы, потому что они будут разделены logrotate "), похоже, вы все еще думаете, что logrotate выполняет разделение файлов. Это неверно, на самом деле происходит то, что logrotate переименовывает существующий файл и создает новый пустой файл с исходным именем.

Пример:

/var/log/syslog
{
        rotate 7
        daily
        missingok
        notifempty
        delaycompress
        compress
        postrotate
                reload rsyslog >/dev/null 2>&1 || true
        endscript
}

Когда запускается logrotate:

  • он переименовывает / var / log / syslog в /var/log/syslog.1
  • , затем создается новый пустой файл / var / log / syslog.
  • переименование файла не влияет ни на какие процессы, у которых был дескриптор открытого файла, поэтому после этого процесс rsyslog по-прежнему записывает в старый файл syslog.0. Обычно способ обойти это - перезагрузить процессы, которые записывают в файл, что и происходит в сценарии postrotate. rsyslog получает команду перезагрузиться, он закрывает свой существующий дескриптор файла на /var/log/syslog.0 и открывает новый дескриптор файла с именем / var / log / syslog, новым пустым файлом, созданным с помощью logrotate.

Надеюсь, теперь вы лучше понимаете, что делает logrotate.

update 2 : Я обращусь к вашим комментариям здесь, так как параметры форматирования в разделе комментариев ограничены.

Итак, когда я понял прямо в части постобработки, необходимо перезагрузить rsyslog, чтобы гарантировать, что старый файловый дескриптор (до вращения) будет закрыт, а новый файловый дескриптор (после вращения) будет открыт (из-за: mv syslog syslog .1)?

Правильно на 100%. После того, как logrotate переместит файл, rsyslog все еще будет писать в старый файловый дескриптор. Процесс выполняет ввод-вывод для файлового дескриптора, имя представляет интерес только при выполнении начального открытия файла.

Я думал, что logrotate имеет некоторый механизм для достижения этого автоматически.

Нет, отсюда и необходимость сделайте это в сценарии постротации. Помните, что не все журналы обязательно выполняются процессом, который хранит дескриптор открытого файла. Если у вас есть процесс, который открывает файл, записывает в него, а затем многократно закрывает (дескриптор файла), то вам не нужно ' t возиться с чем-либо в postrotate.

PS: Вы имели в виду «syslog.0», а не «syslog» в следующем высказывании: «процесс rsyslog все еще записывает в старый файл syslog.0.»? Потому что "старый" журнал - это / var / log / syslog, а не /var/log/syslog.0. Спасибо

Нет. Я имею в виду, что он все еще пишет в существующий файловый дескриптор, который logrotate переименовал в syslog.0. Имея дело с такими процессами, как rsyslog, всегда помните, что имя файла актуально только в момент, когда rsyslog открывает его, то есть когда он создает дескриптор файла. После этого вы можете переименовать, переместить или даже удалить файл, и процесс продолжит беспрепятственно выполнять ввод-вывод для файлового дескриптора.

Имея дело с такими процессами, как rsyslog, всегда помните, что имя файла актуально только в момент, когда rsyslog открывает его, то есть когда он создает дескриптор файла. После этого вы можете переименовать, переместить или даже удалить файл, и процесс продолжит беспрепятственно выполнять ввод-вывод для файлового дескриптора.

Имея дело с такими процессами, как rsyslog, всегда помните, что имя файла актуально только в момент, когда rsyslog открывает его, то есть когда он создает дескриптор файла. После этого вы можете переименовать, переместить или даже удалить файл, и процесс продолжит беспрепятственно выполнять ввод-вывод для дескриптора файла.

5
ответ дан 3 December 2019 в 09:38

Теги

Похожие вопросы