Шпаргалка сисадмина

Установка и настройка Logrotate

14.02.2026 | Категория: Linux

Установка и настройка Logrotate

Установка

В большинстве популярных Linux-дистрибутивов, включая Ubuntu, утилита Logrotate предустановлена и работает по умолчанию. Однако перед началом настройки стоит убедиться, что она действительно присутствует в системе.

Проверить версию можно командой:

logrotate --version

Если это не так, установка выполняется следующими командами.

Ubuntu / Debian:

apt-get install logrotate

CentOS / Red Hat:

yum install logrotate

Fedora:

sudo dnf install logrotate

FreeBSD:

pkg install logrotate

Утилита не работает как служба, поэтому нет необходимости в ее запуске или перезагрузке (logrotate start или logrotate restart делать не нужно).

Настройка

Ротация логов настраивается в отдельных файлах, расположенных по пути /etc/logrotate.conf и /etc/logrotate.d/ (во FreeBSD — /usr/local/etc/logrotate.d/).

/etc/logrotate.conf

В нем задаются общие параметры — например, как часто выполнять ротацию, использовать ли сжатие и где хранить архивы.

Для отдельных сервисов и приложений правила ротации находятся в каталоге:

/etc/logrotate.d/

В нем у каждой программы или службы есть собственный конфигурационный файл. Так, веб-сервер Nginx, почтовый демон Postfix или база данных MySQL будут иметь свои отдельные файлы с параметрами. Это позволяет настраивать ротацию индивидуально под каждое приложение, не изменяя общую конфигурацию.

Важно! При запуске Logrotate сначала считывает настройки из /etc/logrotate.conf, а затем подключает файлы из каталога /etc/logrotate.d/. Благодаря этому можно задавать как глобальные правила, так и точечные — для отдельных логов.

 

Структура конфигурационного файла

Конфигурационный файл Logrotate построен по простому принципу: в нем указываются пути к логам и правила их обработки.

Простейший блок конфигурации выглядит так:

/var/log/nginx/*.log {

    daily

    rotate 7

    compress

    missingok

    notifempty

    postrotate

        systemctl reload nginx

    endscript

}

Разберем основные параметры, которые чаще всего применяются:

  • daily, weekly, monthly, yearly — задают периодичность ротации: ежедневно, еженедельно, ежемесячно или ежегодно;
  • rotate N — определяет, сколько старых файлов хранить (например, rotate 5 оставит пять архивных логов);
  • compress / nocompress — указывает, нужно ли сжимать старые файлы (по умолчанию используется gzip).
  • delaycompress — откладывает сжатие до следующего цикла, чтобы не архивировать слишком свежие файлы;
  • missingok — если файл лога отсутствует, Logrotate не выдаст ошибку и продолжит работу.
  • notifempty — предотвращает ротацию пустых логов;
  • size N — позволяет запускать ротацию при достижении файлом определенного размера (например, size 100M);
  • create mode owner group — создает новый лог с указанными правами доступа и владельцем.
  • postrotate … endscript — блок, внутри которого можно выполнить команды после ротации (например, перезапустить сервис, чтобы он начал писать в новый файл).

 

В большинстве популярных Linux-дистрибутивов, включая Ubuntu, утилита Logrotate предустановлена и работает по умолчанию. Однако перед началом настройки стоит убедиться, что она действительно присутствует в системе.

Проверить версию можно командой:

logrotate --version

К примеру, нам необходимо настроить ротацию лога для logstash-forwarder. Создаем файл со следующим содержимым:

nano /etc/logrotate.d/logstash

/var/log/logstash-forwarder/* {
    rotate 30
    size=10M
    missingok
    notifempty
    daily
    compress
    delaycompress
    maxage 30
    create 0644 root root
    postrotate
        /usr/bin/systemctl restart logstash-forwarder
    endscript
}

/var/log/logstash-forwarder/* — путь к файлу, который нужно ротировать. * указывает, что нужно чистить все файлы, которые расположены в каталоге /var/log/logstash-forwarder.
** имейте в виду, что во FreeBSD, путь может быть /usr/local/etc/logrotate.d/logstash.

Другие примеры читайте в статье Примеры настроек logrotate для различных программ

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

Описание опций

Для описания ротации мы можем использовать следующие директивы:

Параметр Описание
rotate N Хранить последние N ротированных файлов. Остальные удалять.
maxage N Хранить ротированные файлы за последние N дней. Остальные удалять.
copytruncate Сначала создается копия файла лога, после уже обрезается действующий. Это может понадобиться в случаях, когда программа должна писать лог непрерывно. Но существует 2 очевидных минуса: долгое выполнение при больших объемах и возможность потерять небольшое число записей, если из запись придется на процесс усечения.
size=xM Пока размер лог-файла не превысит x мегабайт, он не будет ротироваться.
missingok Если файла не существует, не выкидывать ошибку.
notifempty Если файл пустой, не выполнять никаких действий.
daily Делать ротацию каждый день.
weekly Делать ротацию каждую неделю.
monthly Делать ротацию каждый месяц.
compress Сжимать ротированные файлы.
delaycompress Сжимать только предыдущий журнал. Позволяет избежать ошибок, связанных с отсутствием доступа к используемому файлу.
create 0644 root root Создать новый лог-файл после ротирования с конкретными правами 0644 и владельцем root (меняем значения на нужные). Можно указать без прав (просто create), тогда права будут назначены по умолчанию для пользователя, под которым запускается ротация.
su root root Под какими пользователем и группой выполнять ротацию. В данном примере root (необходимо поменять на нужные).
prerotate ... endscript Скрипт, который необходимо выполнить перед чисткой лога.
postrotate ... endscript Скрипт, который необходимо выполнить после чистки лога.
sharedscripts Если мы указали выполнить ротацию для нескольких файлов (например, при помощи *), скрипт prerotate/postrotate будет выполняться для каждого из них. Данная опция указывает, что скрипт нужно выполнить один раз после завершения ротации всех файлов.

Запуск

Мы можем разово запустить ротацию, а также настроить автозапуск.

Вручную

Запуск выполняется со следующим синтаксисом:

logrotate -f <путь к файлу конфигурации>

Например:

logrotate -f /etc/logrotate.d/logstash

Автоматический

Задание на автоматический запуск создается по умолчанию в файле /etc/cron.daily/logrotate. Если изучить его содержимое, мы увидим, что идет запуск logrotate, который читает все файлы в директории /etc/logrotate.d/ и выполняющий для каждого из них ротацию.

Если для какого-то приложения необходимо выполнять ротацию лога по особому расписанию, узнаем полный путь до утилиты logrotate:

which logrotate

* в моем случае, это было /usr/sbin/logrotate.

Получив путь, создаем правило в cron:

crontab -e

0 0 * * * /usr/sbin/logrotate -f /etc/logrotate.d/logstash

* в данном примере в 00:00 будет запускаться logrotate и чистить логи с нашей настройкой для logstash-forwarder.

или запуск чистки всех логов:

0 0 * * * /usr/sbin/logrotate -f /etc/logrotate.conf

 

Проверка

Выполните команду с флагом --debug, чтобы Logrotate просто показал, что он собирается делать, не меняя файлы:

sudo logrotate /etc/logrotate.conf --debug

Для независимой конфигурации используйте:

logrotate /etc/logrotate.d/logstash --state /var/lib/logrotate/status --debug

В выводе вы должны увидеть строку с упоминанием ваших логов, например:

rotating pattern: /var/log/myapp/*.log

 after 1 days (7 rotations)

considering log /var/log/myapp/app.log

log does not need rotating (log has already been rotated)

Вывод подтвердит (или опровергнет), что Logrotate распознал ваш файл и учел его в работе.

Чтобы убедиться, что конкретный лог действительно обработан, выполните:

sudo cat /var/lib/logrotate/status | grep myapp

 

Как изменить системное расписание Logrotate

По умолчанию Logrotate запускается один раз в день. Это значит, что если в конфигурации вы укажете параметр hourly, он фактически не будет работать — ведь сам процесс ротации выполняется только раз в сутки.

Однако это можно изменить. В Linux запуск Logrotate обеспечивается через cron, а именно специальным скриптом. На Ubuntu этот скрипт находится в каталоге:

/etc/cron.daily/logrotate

Путь к нему указывает, что Logrotate вызывается системой один раз в день. Чтобы изменить расписание и заставить Logrotate запускаться каждый час, нужно переместить скрипт в каталог cron.hourly:

sudo mv /etc/cron.daily/logrotate /etc/cron.hourly

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

 

Как изменить права доступа при работе Logrotate

По умолчанию Logrotate выполняется от имени пользователя root и группы adm. Это позволяет утилите управлять системными логами, которые требуют повышенных привилегий. 

Однако у такого подхода есть свой нюанс: новые лог-файлы, созданные после ротации, будут принадлежать пользователю root и группе adm. В некоторых случаях это мешает самому приложению продолжать запись в файл, так как у него нет нужных прав.

Чтобы избежать подобных проблем, в конфигурации Logrotate используется директива create, которая позволяет задать не только права доступа, но и владельца с группой для новых логов.

Пример:

/etc/logrotate.d/myapp

/var/log/myapp.log {

    daily

    rotate 7

    compress

    notifempty

    create 644 myuser mygroup

}

В этом примере Logrotate при создании нового файла myapp.log установит:

  • права доступа 644 (чтение и запись для владельца, чтение для группы и остальных);
  • владельца файла — myuser;
  • группу — mygroup.

Благодаря этому приложение, работающее от имени пользователя myuser, сможет продолжать записывать данные в новый лог без ошибок доступа.

 

Источник

Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.