Введение / Зачем это нужно
Логирование — краеугольный камень диагностики в Linux. Однако без контроля файлы логов могут бесконечно расти, заполняя раздел /var и приводя к сбоям служб. Ротация логов — это автоматизированный процесс архивации, сжатия и удаления устаревших записей. Использование стандартной утилиты logrotate решает проблему с минимальными усилиями, экономя место и сохраняя историю событий в управляемом виде. После выполнения этого гайда вы получите работающую систему ротации как для системных логов, так и для логов ваших приложений.
Требования / Подготовка
Перед началом убедитесь, что:
- У вас есть доступ к учетной записи с правами sudo.
- Дистрибутив основан на Debian/Ubuntu или RHEL/CentOS/Fedora (конфигурация универсальна, но пути могут незначительно отличаться).
- Установлена утилита
logrotate(обычно есть по умолчанию). Проверить можно командой:logrotate --version - Вы знаете пути к лог-файлам, которые необходимо ротировать (например,
/var/log/nginx/access.log).
Пошаговая инструкция
Шаг 1: Изучение стандартной конфигурации
Главный конфигурационный файл — /etc/logrotate.conf. Откройте его в редакторе (sudo nano /etc/logrotate.conf). Типичное содержимое выглядит так:
# see "man logrotate" for details
# rotate log files weekly
weekly
# 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
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
Ключевые параметры:
weekly— частота ротации (daily,weekly,monthly,yearly).rotate 4— хранить 4 архивированных файла, более старые будут удалены.compress— сжимать ротированные логи с помощьюgzip(файлы получат расширение.gz).create— создавать новый пустой лог-файл после ротации.include /etc/logrotate.d— подключать дополнительные конфигурации из этой директории.
Это глобальные настройки по умолчанию. Для конкретных логов они могут переопределяться.
Шаг 2: Создание конфигурации для вашего приложения
Лучшая практика — создавать отдельные конфиги в /etc/logrotate.d/. Например, для веб-сервера Nginx, который пишет логи в /var/log/nginx/, или для кастомного приложения myapp.
- Создайте файл конфигурации:
sudo nano /etc/logrotate.d/myapp - Добавьте правило. Ниже пример для логов приложения в
/var/log/myapp/:
Разбор блока:/var/log/myapp/*.log { daily missingok rotate 14 compress delaycompress notifempty create 644 myappuser myappgroup sharedscripts postrotate systemctl reload myapp.service > /dev/null 2>&1 || true endscript }/var/log/myapp/*.log— путь к файлам, которые нужно ротировать (поддерживаются glob-шаблоны).daily— ротировать каждый день.missingok— не выдавать ошибку, если файл лога отсутствует.rotate 14— хранить 14 архивов (примерно две недели).delaycompress— сжимать не сразу, а при следующей ротации (чтобы процессы, держащие файл, могли его закрыть).notifempty— не ротировать пустые файлы.create 644 myappuser myappgroup— после ротации создать новый файл с указанными правами и владельцем.sharedscripts— выполнять скриптыpostrotate/prerotateтолько один раз, а не для каждого файла.postrotate ... endscript— команда, выполняемая после ротации. Здесь мы мягко перезагружаем службуmyapp, чтобы она начала писать в новый файл. Это критично для многих демонов!
💡 Совет: Для логов, которые активно пишутся (например,
access.log), всегда используйтеpostrotateс перезагрузкой/сигналом службы (kill -USR1 $(cat /var/run/nginx.pid)). Для статических файлов скрипты не нужны.
Шаг 3: Проверка синтаксиса и тестовый запуск
Не ждите следующего ежедневного cron-запуска. Проверьте конфигурацию:
- Тестовый прогон (dry-run):
sudo logrotate -d /etc/logrotate.conf
Флаг-dвключает режим отладки. Вы увидите, какие файлы будут ротированы и какие действия планируются, но никакие изменения не будут применены. Ищите в выводе строкиrunning postrotate scriptи пути к вашим логам. - Принудительный запуск:
Если тестовый прогон прошел успешно, выполните реальную ротацию:
sudo logrotate -f /etc/logrotate.conf
Флаг-f(force) заставляетlogrotateвыполнить ротацию независимо от времени, прошедшего с последнего запуска. - Проверка результата:
- В директории логов (
/var/log/myapp/) должны появиться сжатые архивы видаmyapp.log.1.gz(последняя ротация) иmyapp.log.2.gzи т.д. - Текущий активный лог (
myapp.log) должен быть вновь создан (если использовалиcreate). - Проверьте время модификации файлов:
ls -laht /var/log/myapp/.
- В директории логов (
Шаг 4: Расписание (cron)
По умолчанию logrotate запускается из системного cron ежедневно через скрипт в /etc/cron.daily/logrotate. Изменить частоту можно, создав символическую ссылку в /etc/cron.hourly/, /etc/cron.weekly/ или добавив свою задачу в /etc/crontab. Однако обычно ежедневного запуска достаточно.
⚠️ Важно: Не запускайте
logrotateслишком часто (например, каждый час) для логов с низкой интенсивностью. Это может привести к ротации пустых файлов и накоплению множества мелких архивов.
Шаг 5: Мониторинг и отладка
Если ротация не работает:
- Проверьте права доступа к лог-файлам и директории
/etc/logrotate.d/. Пользовательrootдолжен иметь доступ. - Убедитесь, что в конфиге нет синтаксических ошибок (фигурные скобки должны быть сбалансированы).
- Проверьте, не блокирует ли файл какая-либо программа. Иногда помогает параметр
copytruncate(копирует файл и обнуляет оригинал, но может привести к потере записей во время копирования). Используйте его только еслиpostrotateнедоступен. - Посмотрите логи самого
logrotate. Они обычно пишутся вsyslog(/var/log/syslogили/var/log/messages). Ищите записи с тегомlogrotate.
Проверка результата
После выполнения шагов 2-3:
- Убедитесь, что в целевой директории логов появились архивированные файлы с расширением
.gz. - Размер текущего лог-файла (
myapp.log) должен быть близок к нулю (если приложение продолжает писать) или равен размеру записей, появившихся с момента последней ротации. - Количество ротированных файлов (
.log.1.gz,.log.2.gz...) не превышает значениеrotate N. - Приложение продолжает корректно писать в новый лог-файл (проверьте, добавляются ли новые записи).
Возможные проблемы
- Ошибка "error: error opening /var/log/myapp/*.log: No such file or directory"
- Причина: Файл лога не существует на момент ротации.
- Решение: Добавьте параметр
missingokв конфигурационный блок. Это безопасно, если лог может создаваться приложением динамически.
- Логи продолжают бесконечно расти, ротация не происходит
- Причина:
logrotateне запускается по cron, или конфигурационный файл имеет неправильные права/имя. - Решение: Проверьте, что файл в
/etc/logrotate.d/имеет расширение.conf(не.txt). Запуститеsudo logrotate -f /etc/logrotate.confвручную и проверьте вывод.
- Причина:
- Приложение перестает писать в лог после ротации
- Причина: Дескриптор файла у процесса приложения остался открытым на старом (удаленном) файле.
- Решение: Обязательно используйте блок
postrotateс командой, заставляющей приложение переоткрыть файл лога (например,systemctl reload,kill -USR1или аналогичная команда для вашего ПО). Избегайтеcopytruncateдля важных логов.
- Нет места на диске после ротации (из-за сжатия)
- Причина: Процесс сжатия (
gzip) создает временную копию файла, требуя свободного места, равного размеру исходного лога. - Решение: Убедитесь, что на разделе
/varдостаточно свободного места (хотя бы размер самого самого большого лога). В крайнем случае временно отключитеcompressв конфиге.
- Причина: Процесс сжатия (
- Ротируются не те файлы
- Причина: Неверный glob-шаблон в пути.
- Решение: Проверьте шаблон командой
ls /var/log/myapp/*.log. Убедитесь, что он соответствует нужным файлам и не захватывает лишние.
Продвинутые настройки (опционально)
size 100M— ротировать не по времени, а когда файл достигнет указанного размера. Можно комбинировать сdaily(ротация будет, если файл большой ИЛИ наступил день).maxsize 500M— ротировать, если файл больше этого размера, даже если не наступил период (например,daily+maxsize).olddir /var/log/myapp/archived— перемещать ротированные файлы в указанную поддиректорию (должна существовать).mail root— отправлять ротированные логи по почте (требует настроенный MTA).su root myappuser— выполнять ротацию от имени другого пользователя (полезно, еслиlogrotateзапускается от root, а логи принадлежат другому юзеру).
Эти параметры добавляются в блок конфигурации (например, /etc/logrotate.d/myapp).