Введение / Зачем это нужно
Лог-файлы (/var/log/) — это ключевой источник информации для диагностики проблем в Linux-системе. Со временем они могут занимать гигабайты дискового пространства, замедлять работу приложений и затруднять поиск нужных записей. Logrotate — это стандартная утилита, которая автоматически управляет логами: ротирует (переименовывает старые, создаёт новые), сжимает архивы и удаляет устаревшие файлы. В этом гайде вы настроите logrotate под свои задачи, чтобы:
- Освободить место на диске, автоматически удаляя старые логи.
- Упростить анализ, разбивая большие файлы на управляемые части (ежедневные, еженедельные).
- Сохранить важные данные в сжатом виде (
*.gz). - Настроить политику хранения для каждого приложения отдельно.
Требования / Подготовка
Перед началом убедитесь, что:
- У вас есть права
sudoили доступ кroot-пользователю. Настройка системных логов требует повышенных привилегий. - Установлена утилита
logrotate. Она входит в базовую поставку几乎所有 дистрибутивов (Ubuntu/Debian, CentOS/RHEL, Fedora). Проверьте:logrotate --version. - Вы понимаете структуру логов вашего приложения: где они находятся (
/var/log/...), как называются (app.log,error.log). - Вы знаете политику ротации: как часто вы хотите ротировать (ежедневно, еженедельно), сколько архивов хранить, нужно ли сжатие.
Пошаговая инструкция
Шаг 1: Изучите структуру конфигурации logrotate
Основной конфиг — /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,rotate 4) — это глобальные настройки по умолчанию. - Строка
include /etc/logrotate.dподключает конфигурации для отдельных приложений из этой директории. Именно туда мы будем добавлять свои правила. - Закомментированные параметры (
#dateext,#compress) можно раскомментировать, чтобы включить.
Шаг 2: Создайте конфигурацию для вашего приложения
Предположим, у вас есть приложение, пишущее логи в /var/log/myapp/access.log и /var/log/myapp/error.log.
- Создайте файл конфигурации:
sudo nano /etc/logrotate.d/myapp - Добавьте следующее содержимое (подробное объяснение ниже):
/var/log/myapp/*.log { daily rotate 14 compress delaycompress missingok notifempty create 644 root root sharedscripts postrotate systemctl reload myapp.service > /dev/null 2>&1 || true endscript }
Разбор блока:/var/log/myapp/*.log— путь к лог-файлам (поддерживаются wildcards).daily— ротировать каждый день. Альтернативы:daily,weekly,monthly,yearly.rotate 14— хранить 14 последних архивов. Старые будут удалены.compress— сжимать ротированные логи с помощьюgzip(файлы станут*.log.1.gz).delaycompress— сжимать не самый последний архив (*.log.1), а начиная со второго (*.log.2.gz). Это нужно, чтобы процесс, пишущий в*.log.1, мог продолжать работать.missingok— не выдавать ошибку, если лог-файл отсутствует.notifempty— не ротировать пустой файл.create 644 root root— после ротации создать новый пустой лог-файл с указанными правами и владельцем.sharedscripts— выполнять скриптыpostrotate/prerotateодин раз для всего блока, а не для каждого файла.postrotate ... endscript— команда, выполняемая после ротации. Здесь мы перезагружаем службу приложения (systemctl reload), чтобы он начал писать в новый файл. Это критично для многих демонов! Для простых файлов, которые пишутся через>>(добавление), можно не использоватьpostrotate. Фраза|| trueподавляет ошибку, если служба не запущена.
Шаг 3: Настройте параметры для системных логов (опционально)
Для стандартных системных логов (например, syslog, auth.log) уже есть конфиги в /etc/logrotate.d/. Их можно изменить. Например, в /etc/logrotate.d/syslog:
/var/log/syslog
/var/log/auth.log
/var/log/kern.log
/var/log/dmesg {
rotate 7
daily
missingok
notifempty
delaycompress
compress
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
sharedscripts
create 640 root adm
mode 640
owner root
group adm
}
Обратите внимание: У syslog часто есть postrotate для перезапуска rsyslog.
Шаг 4: Протестируйте конфигурацию
НИКОГДА не тестируйте на "живых" важных логах без бэкапа!
- Сухое тестирование (Dry Run):
sudo logrotate -d /etc/logrotate.conf
Флаг-dвключает режим отладки. Вы увидите, какие файлы будут ротированы, какие команды выполнены, но никакие изменения не применятся. Ищите в выводе ошибки (error:). - Принудительная ротация для тестового файла:
Создайте тестовый лог:
echo "Test log entry $(date)" | sudo tee /var/log/myapp/test.log
Принудительно запустите ротацию для конкретного конфига:sudo logrotate -f /etc/logrotate.d/myapp
Флаг-f(force) заставляет ротировать файл, даже если по времени/размеру это не требуется. Проверьте результат:ls -lh /var/log/myapp/
Вы должны увидетьtest.log(новый пустой) иtest.log.1(старый, возможно сжатый). - Проверка статуса:
Logrotate хранит информацию о последнем запуске в
/var/lib/logrotate/status. Убедитесь, что дата обновилась:cat /var/lib/logrotate/status
Шаг 5: Убедитесь в автоматической работе по расписанию
Logrotate обычно запускается из cron раз в день. Проверьте:
cat /etc/crontab | grep logrotate
Типичная строка:
17 5 * * * root test -x /usr/sbin/logrotate && /usr/sbin/logrotate /etc/logrotate.conf
Это значит, что утилита запускается каждый день в 5:17. Вы можете изменить расписание, отредактировав этот файл или добавив задание в /etc/cron.daily/logrotate (если ваш дистрибутив использует аналог).
Проверка результата
- Подождите сутки или запустите cron вручную:
sudo run-parts /etc/cron.daily. - Проверьте, что старые логи были переименованы и сжаты:
sudo find /var/log/myapp -type f -name "*.log*" -exec ls -lh {} \; - Убедитесь, что новое логирование продолжается в свежий файл
access.log(добавьте тестовую запись в приложение и проверьте). - Проверьте, что старые архивы удаляются после превышения лимита
rotate.
Возможные проблемы
⚠️ Ошибка: "error: error opening /var/log/...: Permission denied"Причина: У пользователя, от которого работает
logrotate(обычноroot), нет прав на чтение/запись в лог-файлы или директорию. Решение: Убедитесь, что права на лог-файлы и их директорию позволяют чтение/записьroot. Например:sudo chown root:root /var/log/myapp && sudo chmod 755 /var/log/myapp.
⚠️ Логи не ротируются, хотя прошло времяПричина 1: Не достигнут размер (если используется
size), или не наступил период (daily/weekly). Решение 1: Используйтеlogrotate -fдля принудительной ротации или дождитесь срока. Для теста можно временно добавитьsize 1k. Причина 2: В конфиге естьnotifempty, а лог-файл пустой. Решение 2: Удалитеnotifemptyили убедитесь, что в лог пишется.
⚠️ Приложение продолжает писать в старый (ротированный) файлПричина: Не выполнился
postrotateскрипт для перезагрузки/сигнала приложению. Решение: Проверьте команду вpostrotateвручную. Убедитесь, что имя службы (systemctl reload myapp) верное и служба существует. Для приложений, которые не реагируют наSIGHUP, может потребоватьсяrestartили полная остановка/запуск.
💡 Совет: Ротация логов, которые пишутся через
copytruncateЕсли приложение нельзя перезагрузить (не поддерживаетSIGHUP), используйте опциюcopytruncate:/var/log/myapp/*.log { daily rotate 7 compress copytruncate missingok notifempty }Как это работает:
logrotateделает копию лог-файла, а затем усекает (truncate) исходный файл до нулевого размера. Это безопасно, но есть риск потерять записи, которые были сделаны в момент копирования. Используйте только если нет альтернативы.
💡 Совет: Ротация по размеру Чтобы ротировать лог при достижении определённого размера (например, 100 МБ), добавьте
size 100M:/var/log/myapp/*.log { size 100M rotate 5 compress delaycompress missingok notifempty }Теперь ротация произойдёт, как только файл превысит 100 МБ, даже если с последней ротации прошло меньше дня.