Зачем нужна ротация логов
На любом Linux-сервере приложения постоянно пишут логи — системные события, ошибки, доступы. Без управления эти файлы растут бесконечно и могут заполнить весь диск. Logrotate решает эту проблему: автоматически сжимает старые логи, переименовывает их по дате и удаляет устаревшие записи. Без ротации вы рискуете получить остановку сервиса из-за переполненного диска.
В этом гайде вы настроите ротацию логов для любого приложения: от Nginx и Apache до собственных скриптов.
Требования
- Linux-сервер (Ubuntu, Debian, CentOS, RHEL)
- Доступ к терминалу с правами root или sudo
- Базовое понимание работы с конфигурационными файлами
Шаг 1: Проверка установки logrotate
Большинство дистрибутивов поставляют logrotate «из коробки». Проверьте наличие:
which logrotate
logrotate --version
Если команда не найдена, установите:
Ubuntu/Debian:
sudo apt update
sudo apt install logrotate
CentOS/RHEL:
sudo dnf install logrotate
Шаг 2: Структура конфигурационных файлов
Logrotate использует два уровня конфигурации:
/etc/logrotate.conf— главный файл с глобальными настройками/etc/logrotate.d/— директория с отдельными конфигами для приложений
Просмотрите главный конфиг:
cat /etc/logrotate.conf
Типичное содержимое:
# Глобальные настройки
weekly # ротация раз в неделю
rotate 4 # хранить 4 старые копии
create # создавать новый пустой файл после ротации
compress # сжимать старые логи (обычно через gzip)
include /etc/logrotate.d
Шаг 3: Создание конфига для приложения
Допустим, вы хотите ротировать логи веб-сервера Nginx. Создайте файл:
sudo nano /etc/logrotate.d/nginx
Добавьте настройки:
/var/log/nginx/*.log {
daily # ротация каждый день
missingok # не считать ошибкой отсутствие файла
rotate 14 # хранить 14 архивных копий
compress # сжимать архивы (gzip)
delaycompress # сжимать не сразу, а на следующий день
notifempty # не ротировать пустые файлы
create 0640 www-data adm # права на новый файл
sharedscripts # скрипты выполняются один раз для всех файлов
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
Разбор ключевых параметров:
| Параметр | Назначение |
|---|---|
daily/weekly/monthly | Как часто делать ротацию |
rotate N | Сколько старых копий хранить |
compress | Сжимать архивы (добавляет .gz) |
delaycompress | Сжать на следующий цикл |
missingok | Не报错 если файл отсутствует |
notifempty | Пропустить пустые файлы |
size 100M | Ротировать при достижении размера |
Шаг 4: Пример для нескольких приложений
Конфиг для MySQL/MariaDB:
/var/log/mysql/*.log {
daily
rotate 7
compress
missingok
create 0600 mysql mysql
}
Конфиг для Python-приложения с ротацией по размеру:
/var/log/myapp/*.log {
size 50M
rotate 5
compress
missingok
notifempty
}
Шаг 5: Тестирование конфигурации
Важно: всегда тестируйте новые настройки перед применением.
Режим отладки (без реальных изменений):
sudo logrotate -d /etc/logrotate.conf
Вы увидите, какие действия выполнит logrotate, но файлы останутся нетронутыми.
Принудительный запуск (для проверки прямо сейчас):
sudo logrotate -f /etc/logrotate.conf
После этого проверьте, появились ли архивные файлы:
ls -la /var/log/nginx/
Шаг 6: Настройка автоматического запуска
Logrotate обычно вызывается через cron. Проверьте:
ls -la /etc/cron.daily/logrotate
cat /etc/cron.d/logrotate
В Ubuntu/Debian это скрипт в /etc/cron.daily/, который запускается раз в сутки. В CentOS/RHEL может использоваться /etc/cron.daily/logrotate.
Если нужно изменить время запуска, отредактируйте cron:
sudo crontab -e
Добавьте строку (например, запуск в 3 часа ночи):
0 3 * * * /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
Проверка результата
После настройки убедитесь, что:
- Архивные файлы появляются с датой или номером:
access.log.1,access.log.2.gz - Старые файлы сжимаются в
.gz - Количество файлов не превышает значение
rotate - Логи старше срока хранения удаляются автоматически
Проверьте через неделю:
ls -lh /var/log/nginx/
Возможные проблемы
Логи не ротируются
- Проверьте права доступа:
ls -la /var/log/приложение/ - Убедитесь, что путь в конфиге совпадает с реальным расположением логов
Ошибка «error: destination /var/log/... already exists»
- Удалите старые архивы вручную или увеличьте значение
rotate
Postrotate-скрипт не выполняется
- Проверьте синтаксис: команда между
postrotateиendscript - Убедитесь, что процесс (nginx, apache) запущен
Диск всё равно заполняется
- Проверьте, что
compressвключён - Уменьшите значение
rotateили добавьтеsizeдля более частой ротации