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