Введение
Logrotate — это утилита для автоматического управления лог-файлами в Linux. Она предотвращает бесконтрольный рост логов, который может заполнить весь диск и привести к сбоям системы. С помощью logrotate вы настроите регулярную ротацию (переименование старых логов), сжатие архивов и удаление устаревших данных. После настройки процесс станет полностью автоматическим, а вы сэкономите время и место на диске.
Требования / Подготовка
Перед началом убедитесь, что:
- На системе установлен пакет
logrotate(обычно есть по умолчанию). - У вас есть права суперпользователя (sudo) для редактирования конфигурационных файлов в
/etc/. - Вы знаете пути к лог-файлам, которые хотите ротировать (например,
/var/log/nginx/access.log). - Рекомендуется базовое понимание структуры каталогов Linux и работы с текстовыми редакторами (nano, vim).
Шаг 1: Проверка установки logrotate
Откройте терминал и выполните команду:
logrotate --version
Если вы видите версию (например, logrotate 3.18.0), утилита установлена. Если команда не найдена, установите её:
Для Debian/Ubuntu:
sudo apt update
sudo apt install logrotate
Для RHEL/CentOS/Fedora:
sudo yum install logrotate # CentOS/RHEL 7
sudo dnf install logrotate # CentOS/RHEL 8+, Fedora
⚠️ Важно: На большинстве современных дистрибутивов logrotate предустановлен. Установка требуется редко.
Шаг 2: Изучение структуры конфигурационных файлов
Logrotate использует два типа конфигураций:
- Главный файл —
/etc/logrotate.conf. Он содержит глобальные настройки (например, частоту запуска) и может включать другие конфиги. - Файлы приложений — в каталоге
/etc/logrotate.d/. Каждый файл отвечает за ротацию логов конкретного сервиса или приложения.
Посмотрите примеры:
ls /etc/logrotate.d/
Вы увидите файлы для apt, dpkg, rsyslog и других. Это поможет понять синтаксис.
Откройте главный конфиг:
sudo cat /etc/logrotate.conf
Типичное содержимое:
# see "man logrotate" for details
weekly
rotate 4
create
include /etc/logrotate.d
Здесь weekly — глобальная частота ротации (если не переопределено в локальных конфигах), rotate 4 — хранить 4 архива, include — подключать конфиги из /etc/logrotate.d/.
Шаг 3: Создание конфигурационного файла для вашего приложения
Предположим, ваше приложение пишет логи в /var/log/myapp/ (файлы app.log, error.log). Создайте конфиг:
sudo nano /etc/logrotate.d/myapp
Вставьте базовую конфигурацию:
/var/log/myapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 644 root root
sharedscripts
postrotate
systemctl restart myapp.service > /dev/null 2>&1 || true
endscript
}
Краткое описание параметров:
/var/log/myapp/*.log— шаблон для лог-файлов.daily— ротация каждый день.rotate 7— хранить 7 архивов (старые будут удалены).compress— сжимать архивы с помощью gzip.delaycompress— сжимать не сразу, а на следующую ротацию (чтобы приложение могло писать в ещё не сжатый файл).missingok— не выводить ошибку, если лог-файл отсутствует.notifempty— не ротировать пустые файлы.create 644 root root— создавать новый лог-файл с правами 644 и владельцем root:root.sharedscripts— скриптыpostrotate/prerotateвыполняются один раз за весь набор файлов.postrotate...endscript— команды после ротации (здесь перезапуск сервиса, чтобы он начал писать в новый лог).
Сохраните файл (Ctrl+X, затем Y и Enter в nano).
Шаг 4: Настройка параметров ротации
Конфигурация из шага 3 — хорошая база, но параметры нужно адаптировать под ваши задачи. Вот ключевые опции:
| Параметр | Значение | Описание |
|---|---|---|
daily/weekly/monthly | — | Частота ротации. |
rotate N | N — число | Количество архивов для хранения. |
compress | — | Сжимать архивы gzip (расширение .gz). |
delaycompress | — | Отложить сжатие на следующую ротацию (рекомендуется для активных логов). |
missingok | — | Игнорировать отсутствующие файлы. |
notifempty | — | Не ротировать пустые файлы. |
maxsize SIZE | Например, 100M | Ротировать, если размер превышает (даже если не прошло время). |
size SIZE | Например, 50M | Ротировать по размеру (игнорирует частоту). |
create MODE OWNER GROUP | — | Создавать новый лог-файл с указанными правами и владельцем. |
postrotate/prerotate | команды | Выполнить скрипт до/после ротации (часто для переоткрытия логов). |
Пример для ротации по размеру:
/var/log/myapp/*.log {
size 100M
rotate 5
compress
missingok
notifempty
create 644 root root
}
Здесь логи будут ротироваться, как только достигнут 100 МБ, но не чаще чем раз в день (если не указана частота).
Шаг 5: Тестирование конфигурации
Перед запуском в production проверьте конфиг:
sudo logrotate -d /etc/logrotate.conf
Флаг -d (debug) показывает, какие действия будут выполнены, но не вносит изменения. Вывод будет содержать строки вида:
reading config file /etc/logrotate.conf
including /etc/logrotate.d
...
rotating pattern: /var/log/myapp/*.log after 1 days (7 rotations)
empty log files are not rotated, old logs are removed
...
Если есть ошибки (например, "error: bad directive"), исправьте конфиг.
Шаг 6: Принудительный запуск и автоматизация
Для немедленной ротации (например, чтобы проверить работу) выполните:
sudo logrotate -f /etc/logrotate.conf
Флаг -f (force) игнорирует временные ограничения.
Автоматизация: Logrotate обычно запускается ежедневно через cron. Проверьте задачу:
ls /etc/cron.daily/logrotate
Если файл существует, cron будет запускать logrotate автоматически (обычно в 6:25 утра). Для изменения времени отредактируйте файл или настройте аналог через systemd timer (в современных системах).
Проверка результата
- Перейдите в каталог с логами:
ls -lh /var/log/myapp/ - Вы должны увидеть:
- Активный лог-файл (например,
app.log). - Сжатые архивы (например,
app.log.1.gz,app.log.2.gzи т.д.) в зависимости от параметраrotate.
- Активный лог-файл (например,
- Проверьте размеры: активный лог должен быть небольшим (если ротация прошла), архивы — сжаты.
- Также проверьте системный журнал на наличие ошибок logrotate:
sudo grep logrotate /var/log/syslog
Возможные проблемы
Ошибка доступа к лог-файлам
💡 Если в логах или при запуске logrotate появляются
Permission denied, убедитесь, что:
- Файлы логов доступны для чтения пользователю, от которого запущен logrotate (обычно root).
- В конфиге указан правильный владелец в
create(например,create 644 www-data www-dataдля веб-сервера).
Логи не ротируются по расписанию
- Проверьте, работает ли cron:
sudo systemctl status cron(Debian/Ubuntu) илиsudo systemctl status crond(RHEL/CentOS). - Убедитесь, что файл
/etc/cron.daily/logrotateсуществует и исполняем (ls -l /etc/cron.daily/logrotate). - Если используется systemd timer, проверьте:
sudo systemctl status logrotate.timer.
Сжатие не происходит
- Убедитесь, что установлен
gzip(обычно есть по умолчанию). Проверьте:which gzip. - В конфиге должен быть параметр
compress(илиdelaycompress). - Если нужно сжимать другими алгоритмами (bzip2, xz), укажите
compresscmd(например,compresscmd /usr/bin/bzip2).
Приложение продолжает писать в старый лог после ротации
Это частая проблема: после переименования лог-файла приложение не осознаёт этого и продолжает писать в старый дескриптор. Решение:
- В блоке
postrotateдобавьте команду для переоткрытия логов. Например, для nginx:postrotate [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid` endscript - Для systemd-сервисов часто помогает
systemctl restart service, но это может привести к кратковременному простою. Альтернатива — использоватьkill -HUP(если приложение поддерживает).
Конфликты конфигураций
- Logrotate обрабатывает файлы в
/etc/logrotate.d/в алфавитном порядке. Если два конфига пересекаются по одному лог-файлу, победит последний (по алфавиту). Избегайте дублирования. - Глобальные настройки из
/etc/logrotate.confприменяются, только если не переопределены в локальном конфиге.