Logrotate − утилита, которая позволяет автоматически управлять журналами событий в системах, основанных на Linux. Системные логи и логи приложений, как правило, имеют свойство разрастаться в размерах, и данный процесс может происходить бесконтрольно. Веб-приложение или почтовый сервер способны писать десятки мегабайт в день, особенно если они обслуживают посещаемый и активно используемый ресурс. Основная идея logrotate − это автоматическая ротация файлов журналов событий. Утилита переименовывает текущий лог-файл, возможно сжимает его, и на его месте создаёт новый пустой файл. Такой подход позволяет файлам журналов событий не выходить за пределы допустимого объёма и упрощает администрирование системы.
Использование logrotate
Обычно logrotate для своей работы использует cron
. Утилита запускает задание каждый день, в результате чего обходит все свои конфигурации. Конфигурация может быть глобальной, например, /etc/logrotate.conf
, а может быть разбита по файлам в каталоге /etc/logrotate.d/
. Во втором случае каждое приложение, вроде Nginx или MySQL, может иметь свой отдельный файл с правилами. Logrotate умеет выполнять ротацию по времени, например, каждый день, раз в неделю или два раза в месяц. Но может делать это, ориентируясь на размер файла. К примеру, если файл журнала событий превышает 100 или 500 мегабайт. При этом утилита позволяет указывать, сколько копий старых лог-файлов нужно хранить. Например, rotate 5
означает, что будут храниться 5 последних ротаций.
Logrotate может сжимать старые лог-файлы в основном при помощи gzip
. Делается это с использованием ключа compress
. Если нет необходимости в сжатии файла сразу после ротации, можно добавить delaycompress
. Ещё одна интересная опция − create
. Она позволяет не просто переименовать лог-файл, но ещё и создать новый с требуемыми правами и владельцем. Это может пригодиться для того, чтобы, например, Nginx мог снова писать логи без каких-либо проблем. В случае, если после проведения ротации необходимо выполнить произвольные команды, используется блок postrotate ... endscript
. В этом блоке можно запускать скрипты или отдельные команды, например, перезапуск службы, отправку сигнала или перевод записи событий в другой лог-файл.
При использовании на виртуальном выделенном сервере logrotate особенно полезен из-за того, что файлы журналов событий могут быстро заполнить всё свободное пространство. Имеет смысл применять данную утилиту в отношении таких системных служб, как:
rsyslog
илиjournald
− системные события и события авторизации;cron
− логи задач по расписанию;dmesg
− буфер ядра.
Также logrotate часто используется для ротации файлов журналов событий веб-серверов (Nginx, Apache, Angie), баз данных (MySQL, MariaDB, PostgreSQL), почтовых серверов (Postfix, Dovecot).
Пример использования logrotate
Ниже приведён пример конфигурации logrotate для веб-сервера Nginx. Его можно сохранить, например, в файле /etc/logrotate.d/nginx
:
/var/log/nginx/*.log
{
daily
missingok
rotate 10
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
endscript
}
В начале блока строка /var/log/nginx/*.log
означает, что будут обрабатываться все файлы с расширением .log
в каталоге /var/log/nginx
. Ниже указаны директивы, каждая из которых настраивает поведение ротации.
daily
означает, что логи будут ротироваться ежедневно, то есть раз в сутки.missingok
указывает, что если какого-то файла нет, то это не ошибка, и утилита его пропустит. Это удобно, так как некоторые логи могут временно не существовать, особенно на малонагруженных системах.rotate 10
означает, что будут сохраняться до 10 старых версий лог-файлов. При создании 11-го самый старый будет удалён.compress
указывает на необходимость сжимать старые файлы, как правило, с использованиемgzip
.delaycompress
означает, что файл будет сначала переименован без сжатия, и только в следующем цикле − сжат. Данная директива полезна, если есть вероятность того, что некоторые процессы ещё будут какое-то время обращаться к файлу, уже прошедшему ротацию.notifempty
позволяет не обрабатывать файл, если он пустой.create 0640 www-data adm
указывает на то, что после ротации лог-файла будет создан новый с правами0640
, владельцемwww-data
и группойadm
. Для Nginx это критично, поскольку веб-сервер должен иметь права на запись в лог-файл, иначе он просто перестанет логировать.sharedscripts
означает, чтоpostrotate
должен быть вызван только один раз, даже если в списке несколько файлов. Это важно, поскольку дальше идёт блокpostrotate
, и без этой опции команда внутри может выполниться по одному разу для каждого лог-файла отдельно.- Блок
postrotate ... endscript
содержит команду, которую нужно выполнить после ротации. В частности,kill -USR1 $(cat /var/run/nginx.pid)
отправляет веб-серверу сигналUSR1
, который вынуждает его открыть лог-файл заново. Без этой команды Nginx будет продолжать сохранять журналы событий в старый файл. Это, естественно, нарушит нормальный ход логирования.
Установка logrotate
Наличие предустановленной утилиты logrotate зависит от образа системы, используемой на виртуальном выделенном сервере. Проверить наличие logrotate в системе можно при помощи команды, которая выводит версию утилиты:
$ sudo logrotate --version
Если утилита установлена, её вывод будет выглядеть примерно следующим образом:

В свою очередь, вывод команды, показанный на скриншоте ниже, говорит об отсутствии logrotate в системе:

Чтобы проинсталлировать logrotate в Ubuntu или Debian, выполните команду:
$ sudo apt install logrotate
Для CentOS аналогичное действие выполняется при помощи команды:
$ sudo dnf install logrotate
Кроме того, убедиться в том, что утилита работает, можно, запустив отладку конфигурации logrotate без реального выполнения ротации:
$ logrotate -d /etc/logrotate.conf
Вывод команды должен показать, что именно утилита должна будет сделать, но при этом она не переименует, не удалит и не создаст новые файлы журналов событий.