Введение / Зачем это нужно
Logrotate — это стандартный утилита в Linux для автоматической ротации, сжатия и удаления старых лог-файлов. Без настройки логи могут бесконечно расти, заполняя весь диск и вызывая сбои в работе системы. Настроив logrotate, вы:
- Автоматически управляете размером логов.
- Сохраняете историю за заданный период (например, 7 дней).
- Сжимаете архивы, экономя место.
- Обеспечивайте бесперебойную работу сервисов, которые пишут логи.
Этот гайд подойдет для администраторов Linux и разработчиков, которые работают с серверами (веб-серверы, базы данных, кастомные приложения).
Требования / Подготовка
Перед началом убедитесь, что:
- У вас есть root-доступ или права
sudoдля редактирования файлов в/etc/. - Logrotate установлен (обычно есть по умолчанию в большинстве дистрибутивов). Проверьте командой:
Если нет, установите:which logrotate- Ubuntu/Debian:
sudo apt update && sudo apt install logrotate - CentOS/RHEL:
sudo yum install logrotate
- Ubuntu/Debian:
- Логи пишутся в файлы, а не только в stdout/stderr. Если приложение пишет в stdout (например, Docker без драйвера json-file), настройте перенаправление в файл или используйте
systemd-journald.
Шаг 1: Создание конфигурационного файла
Logrotate читает конфигурации из двух мест:
- Основной файл:
/etc/logrotate.conf - Дополнительные файлы в
/etc/logrotate.d/(рекомендуется для каждого сервиса отдельно).
Создайте конфиг для вашего приложения. Например, для веб-сервера Nginx:
sudo nano /etc/logrotate.d/nginx
Добавьте базовый шаблон:
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 644 www-data www-data
sharedscripts
postrotate
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript
}
Пояснение параметров:
/var/log/nginx/*.log— путь к логам (поддерживаются wildcards).daily— ротация каждый день.missingok— игнорировать, если файл лога отсутствует.rotate 14— хранить 14 архивов.compress— сжимать ротированные логи gzip (файлы.gz).delaycompress— сжимать не сразу, а на следующий день (чтобы можно было читать свежий лог).notifempty— не ротировать пустые файлы.create 644 www-data www-data— создавать новый пустой лог-файл с указанными правами и владельцем после ротации.sharedscripts— выполнять скрипты (postrotate) один раз для всех файлов в блоке.postrotate— после ротации отправить сигнал Nginx, чтобы он переоткрыл файлы логов.
Для других приложений укажите свои пути и команды переоткрытия логов (например, для Apache: invoke-rc.d apache2 reload).
Шаг 2: Настройка параметров ротации
Вы можете настроить частоту и другие опции под свои нужды:
- Частота:
daily(ежедневно),weekly(еженедельно),monthly(ежемесячно). Можно также использоватьhourly(ежечасно), если logrotate запускается из cron hourly (обычно нет). - Количество архивов:
rotate N— сколько последних архивов хранить. Например,rotate 30— хранить 30 дней. - Удаление по возрасту:
maxage N— удалять архивы старше N дней (даже еслиrotateне достигнуто). - Размер вместо времени:
size 100M— ротировать, когда лог достигает 100 МБ (можно комбинировать с частотой:dailyиsizeработают вместе). - Сжатие:
compress(gzip) илиnocompress. Для более быстрого сжатия можно использоватьdelaycompress. - Права на новые файлы:
create mode owner group(как в примере выше).
Пример для логов приложения, которое пишет в /opt/myapp/logs/app.log и требует перезапуска службы:
/opt/myapp/logs/app.log {
weekly
rotate 8
compress
delaycompress
missingok
notifempty
create 640 myuser mygroup
sharedscripts
postrotate
systemctl restart myapp.service > /dev/null 2>&1 || true
endscript
}
Шаг 3: Тестирование конфигурации
После создания конфига обязательно протестируйте его:
- Сухой прогон (dry-run):
sudo logrotate -d /etc/logrotate.conf
Флаг-dпоказывает, какие действия будут выполнены, но не применяет их. Ищите в выводе ошибки (например, "error: bad option" или "cannot open"). - Принудительный запуск:
sudo logrotate -f /etc/logrotate.conf
Флаг-f(force) запускает ротацию независимо от времени. После этого проверьте, что:- Старые логи переименованы (например,
access.log.1,access.log.2.gz). - Создан новый пустой лог-файл (если указан
create). - Сжатые файлы имеют расширение
.gz.
- Старые логи переименованы (например,
- Проверка логов самого logrotate:
Обычно logrotate пишет свои ошибки в syslog. Проверьте:
grep logrotate /var/log/syslog # или для RHEL/CentOS: grep logrotate /var/log/messages
Шаг 4: Автоматизация через cron
Logrotate по умолчанию запускается из cron ежедневно. Проверьте наличие скрипта:
ls -l /etc/cron.daily/logrotate
Обычно это символическая ссылка на /usr/sbin/logrotate. Если нужно изменить расписание (например, на еженедельное), отредактируйте crontab root:
sudo crontab -e
И замените строку (если есть) на:
0 3 * * 0 /usr/sbin/logrotate /etc/logrotate.conf
Это запустит logrotate в 3:00 утра каждое воскресенье.
Важно: Не запускайте logrotate слишком часто (например, каждые 5 минут) для больших логов — это может нагрузить систему.
Проверка результата
После принудительного запуска (или по истечении периода) убедитесь, что:
- Ротированные файлы появились в папке с логами:
ls -lh /var/log/nginx/
Вы должны увидетьaccess.log.1(прошлый день) и, возможно,access.log.2.gz(архив). - Новый лог-файл создан и имеет правильные права (если использовали
create). - Приложение продолжает писать логи в новый файл. Проверьте, что в
access.log(новом) появляются записи. - Размер диска не растет бесконтрольно:
sudo du -sh /var/log/nginx/ - Количество архивов не превышает
rotate. Если хранится больше, возможно,maxageконфликтует или старые файлы не удаляются из-за прав.
Возможные проблемы
1. Ошибка "Permission denied" при ротации или создании файлов
Причина: Пользователь, от которого запущен logrotate (обычно root), не имеет прав на запись в директорию с логами или на создание файлов с указанными владельцем/группой. Решение:
- Убедитесь, что директория с логами доступна для записи root (или укажите правильного владельца в
create). - Если логи пишет непривилегированный пользователь (например,
www-data), используйтеsu www-dataв блоке конфига (если logrotate поддерживает) или настройте права так, чтобы root мог менять файлы.
2. Logrotate не ротирует логи, хотя прошло время
Причина:
- Неправильная настройка частоты (например,
daily, но вы тестируете в тот же день). - Файл лога не изменился с последней ротации (если есть
notifemptyи файл пустой). - Logrotate не запускается из cron (проверьте
/etc/cron.daily/).
Решение:
- Используйте
logrotate -fдля принудительной ротации. - Уберите
notifempty, если хотите ротировать пустые файлы. - Проверьте, что cron работает:
systemctl status cron(Debian/Ubuntu) илиcrond(RHEL/CentOS).
3. Приложение перестает писать логи после ротации
Причина: Приложение не переоткрывает файл лога после его переименования. Обычно это решается сигналом в postrotate (например, kill -USR1 для Nginx) или перезапуском службы.
Решение:
- Убедитесь, что команда в
postrotateкорректна и не вызывает ошибок. Протестируйте ее вручную. - Для systemd-сервисов можно использовать
systemctl reload <service>. - Если приложение пишет в файл напрямую без буферизации, оно может продолжить писать в старый файл (который переименован). В этом случае перезапуск службы необходим.
4. Сжатие занимает много времени или ресурсов
Причина: Большие логи сжимаются в момент пиковой нагрузки. Решение:
- Используйте
delaycompress— сжатие откладывается до следующего запуска logrotate. - Настройте ротацию по размеру (
size 500M) в менее загруженное время. - Рассмотрите использование
compresscmdс более быстрым алгоритмом (например,pigzдля параллельного сжатия), если установлен.
5. Ротируются не те файлы (например, ротируются архивы .gz)
Причина: Шаблон пути слишком общий (например, /var/log/app/* захватывает и .gz файлы).
Решение: Уточните шаблон: /var/log/app/*.log вместо /var/log/app/*. Или добавьте prerotate/postrotate для исключения, но лучше уточнить шаблон.