Управление логами с помощью Logrotate
Настройка Logrotate для управления системными и прикладными журналами
При работе с виртуальными серверами или выделенными серверами важно вести учет событий и ошибок для мониторинга и диагностики работы системы.
Однако большие файлы логов создают ряд сложностей. Их трудно просматривать и обрабатывать, они потребляют значительные ресурсы процессора и памяти, а при переполнении диска могут вызывать сбои в работе приложений.
Ротация логов помогает решить эти проблемы, автоматически архивируя текущие записи и создавая новые файлы для поступающих данных.
В Linux для управления ротацией логов используется утилита Logrotate. В этой статье мы разберем принцип её работы и настройку под конкретные требования.
Logrotate обычно предустановлена в большинстве дистрибутивов Linux и автоматически запускается через планировщик cron. Для проверки наличия утилиты и её версии выполните команду:
logrotate --version
В результате отобразится информация о версии и базовых настройках:
logrotate 3.21.0
Default mail command: /usr/bin/mail
Default compress command: /bin/gzip
Default uncompress command: /bin/gunzip
Default compress extension: .gz
Default state file path: /var/lib/logrotate/status
ACL support: yes
SELinux support: yes
Вывод указывает, какие инструменты Logrotate применяет для сжатия логов и отправки уведомлений, а также путь к файлу состояния, где фиксируется история ротации.
Конфигурация Logrotate имеет иерархическую структуру. Глобальные параметры по умолчанию задаются в основном конфигурационном файле /etc/logrotate.conf,
а конфигурации для отдельных приложений размещаются в каталоге /etc/logrotate.d/.
Пример содержимого файла /etc/logrotate.conf для Ubuntu:
/etc/logrotate.conf
# rotate log files weekly
weekly
# use the adm group by default, since this is the owning group
# of /var/log/.
su root adm
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# use date as a suffix of the rotated file
#dateext
# uncomment this if you want your log files compressed
#compress
# packages drop log rotation information into this directory
include /etc/logrotate.d
Согласно конфигурации:
- Ротация логов происходит еженедельно (
weekly). - После ротации создаются новые пустые файлы логов (
create). - Архивные копии логов хранятся за последние 4 недели (
rotate 4). - Директива
su root admобеспечивает выполнение ротации от имени пользователя root и группы adm, что предотвращает проблемы с доступом к системным логам. - Сжатие (
compress) по умолчанию отключено, но его можно включить для экономии дискового пространства. - Строка
include /etc/logrotate.dуказывает Logrotate загружать все конфигурационные файлы из каталога/etc/logrotate.d. Это обеспечивает модульный подход, при котором пакеты определяют свои собственные правила ротации логов, не изменяя глобальные настройки.
Для ознакомления с полным перечнем директив используйте справочник:
man logrotate
Глобальный конфигурационный файл задаёт только директивы по умолчанию, которые применяются ко всем логам, определённым в подключаемых конфигурациях (например, в /etc/logrotate.d).
При просмотре содержимого этого каталога можно обнаружить файлы настроек для различных установленных сервисов.
Структура файлов для отдельных приложений похожа на глобальную конфигурацию, но применяется только к конкретным логам:
/etc/logrotate.d/nginx
/var/log/nginx/*.log {
# Эти директивы применяются только к логам Nginx
daily
missingok
rotate 14
compress
notifempty
# другие настройки, относящиеся к Nginx
}
Параметры внутри этих файлов переопределяют глобальные значения из /etc/logrotate.conf. Если какая-то директива не указана в конфигурации приложения, то используется её значение из глобального файла.
Примечание
Если в /etc/logrotate.conf задано rotate 4, а в файле приложения в /etc/logrotate.d/ директива rotate отсутствует, то логи этого приложения также будут ротироваться с сохранением четырёх резервных копий.
По умолчанию Logrotate использует временной подход, при котором файлы логов ротируются по фиксированному расписанию. Поддерживаются следующие интервалы:
- hourly (почасово)
- daily (ежедневно)
- weekly (еженедельно)
- monthly (ежемесячно)
- yearly (ежегодно)
Когда вы указываете один из этих интервалов, Logrotate проверяет, прошло ли с момента последней ротации указанное время. Если да — лог ротируется.
Logrotate часто настроен на уровне всей системы так, чтобы запускаться один раз в день через /etc/cron.daily/logrotate. Если вы используете опцию hourly для конкретного файла лога, необходимо убедиться, что сам Logrotate запускается чаще. Для этого соответствующую задачу cron нужно переместить в путь для почасового выполнения:
sudo mv /etc/cron.daily/logrotate /etc/cron.hourly # В Ubuntu
Если требуется, чтобы Logrotate запускался ещё чаще, может понадобиться настроить пользовательскую задачу cron.
Для сервисов, создающих непредсказуемый объём логов, чисто временной график ротации может приводить к слишком большим файлам логов или, наоборот, к множеству маленьких файлов в периоды низкой активности.
В этом случае можно использовать ротацию по размеру. Директива size сообщает Logrotate, что ротация должна выполняться только тогда, когда файл лога достигнет определённого размера, независимо от временного графика. Например:
/etc/logrotate.d/app
/var/log/app/*.log {
daily # теперь игнорируется
size 50M # учитывается последняя указанная опция
}
Такая настройка гарантирует, что указанный файл лога будет ротироваться только при превышении 50 МБ, даже если дневной интервал уже выполнен. Размеры можно указывать в байтах (по умолчанию), килобайтах (k), мегабайтах (M) или гигабайтах (G).
Важно
Директива size и временные параметры взаимно исключают друг друга — всегда учитывается последняя указанная опция. Если поменять местами size и daily, файлы будут ротироваться ежедневно, а размер игнорироваться.
Для более гибкого управления Logrotate предоставляет директивы minsize и maxsize, которые работают вместе с временными графиками:
- minsize — ротация выполняется только если достигнут минимальный размер файла при соблюдении временного интервала:
/etc/logrotate.d/app
/var/log/app/*.log {
daily
minsize 50M
}
Здесь лог ротируется ежедневно, но только если его размер не менее 50 МБ. Если при проверке файл меньше, ротация произойдёт позже, когда условие будет выполнено.
- maxsize — ротация выполняется сразу, как только файл превышает указанный размер, даже если время ещё не наступило. Также ротация произойдёт в запланированное время, если предел maxsize не превышен:
/etc/logrotate.d/app
/var/log/app/*.log {
daily
maxsize 50M
}
Эти опции позволяют избежать слишком частой ротации маленьких файлов (minsize) и предотвратить чрезмерный рост больших файлов до следующего планового времени (maxsize).
Logrotate поддерживает два основных метода работы с активным файлом лога: create и copytruncate.
/var/log/app/*.log {
create
# Можно указать права, владельца и группу:
# create 644 <appuser> <group>
}
-
create (метод по умолчанию) переименовывает активный файл, например
app.log→app.log.1, и создаёт новый пустой файл с оригинальным именем. Новый файл наследует атрибуты старого файла, но их можно указать явно. Метод является предпочтительным, так как минимизирует риск потери логов при условии, что приложение умеет сразу писать в новый файл. -
copytruncate копирует содержимое текущего файла в ротационный файл, а затем обнуляет оригинальный файл:
/etc/logrotate.d/app
/var/log/app/*.log {
copytruncate
}
Этот метод позволяет приложениям продолжать писать в тот же файл с тем же дескриптором.
Примечание
Метод copytruncate рекомендуется только для устаревших приложений, которые не могут корректно закрывать и открывать файлы логов.
Logrotate также поддерживает директиву copy, которая копирует файл без обнуления оригинала — полезно для отдельных сценариев, но не заменяет create или copytruncate для постоянного логирования.
По умолчанию ротационные файлы получают последовательные номера, например app.log.1, app.log.2 и т. д. Это сохраняет порядок, но не показывает дату создания.
Директивы dateext и dateformat позволяют добавлять временные метки:
/etc/logrotate.d/app
/var/log/app/*.log {
dateext
dateformat # по умолчанию -%Y%m%d для daily, -%Y%m%d%H для hourly
}
Примечание
Лог, ротированный 25 июня 2025 года, будет называться app.log-20250625.
Если лог ротируется несколько раз в день (size-based или hourly), можно использовать Unix timestamp для уникальности:
/var/log/app/*.log {
dateformat -%Y%m%d-%s # создаёт app.log-20250625-1748181385
}
Директива dateyesterday позволяет ставить дату предыдущего дня вместо текущей — удобно, если обработка происходит после полуночи, а данные относятся к предыдущему дню.
Сжатие экономит место на диске. Директива compress использует gzip:
/etc/logrotate.d/app
/var/log/app/*.log {
compress
}
Можно использовать и другие архиваторы через compresscmd, uncompresscmd и compressext:
/etc/logrotate.d/app
/var/log/app/*.log {
compress
compresscmd /usr/bin/bzip2
uncompresscmd /usr/bin/bunzip2
compressext .bz2
}
Директива delaycompress предотвращает немедленное сжатие последнего ротационного файла, что полезно, если программа продолжает писать в старый файл после ротации.
/etc/logrotate.d/app
/var/log/app/*.log {
compress
delaycompress
}
compressoptions позволяет задать уровень сжатия gzip от -1 (быстро, слабое сжатие) до -9 (медленно, максимальное сжатие):
/etc/logrotate.d/app
/var/log/app/*.log {
compress
compressoptions -9
}
Если ротация не работает, проверьте:
- права доступа
- ошибки в конфигурации
- конфликты по времени
Файл состояния Logrotate (/var/lib/logrotate/status) содержит информацию о последней ротации файлов:
sudo cat /var/lib/logrotate/status
Для более детального анализа используйте debug mode:
sudo logrotate --debug /etc/logrotate.conf