Установка и настройка 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, сможет продолжать записывать данные в новый лог без ошибок доступа.