Назад | Перейти на главную страницу

unix logrotate указать размер блока

Как я могу указать желаемый размер выходного файла после ротации? Например, скажем, я хочу запустить logrotate, когда файл журнала достигнет 10 МБ, и я хочу разбить этот журнал на куски размером не более 1 МБ. Я нашел параметры «размер», но они устанавливают предел, выше которого запускается logrotate, а не размер желаемого фрагмента. Спасибо

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

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

Обновить: на основании вашего комментария («слишком поздно разбивать файлы, потому что они будут разделены с помощью 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.

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

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

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

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

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

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

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