В этой статье разберём:
- что такое ротация логов и зачем она нужна;
- где находятся настройки
logrotate; - как создать своё правило для очистки старых логов;
- как проверить конфигурацию без риска всё сломать;
- какие параметры используются чаще всего и что они значат;
- какие ошибки бывают при настройке и как их исправить.
Что такое logrotate простыми словами
На сервере почти всё пишет логи: Nginx, Apache, PHP, MariaDB, PostgreSQL, cron, systemd, собственные скрипты. Лог — это обычный текстовый файл, куда сервис записывает события: ошибки, запросы, предупреждения, служебную информацию.
Проблема в том, что такие файлы не умеют «худеть» сами по себе. Если ничего не делать:
- логи будут расти и занимать всё больше места на диске;
- найти в них нужную запись станет сложнее;
- в какой-то момент диск может просто закончиться.
Ротация логов — это процесс, при котором старый лог «сворачивается» в архив, а на его месте создаётся новый пустой файл. Например:
app.log → текущий лог
app.log.1 → предыдущий лог
app.log.2.gz → старый лог, уже сжатый
app.log.3.gz → ещё более старый лог
Именно этим и занимается logrotate.
Проверяем, установлен ли logrotate
На Ubuntu/Debian logrotate обычно уже установлен, но лучше проверить:
logrotate --version
Если команда не найдена, ставим пакет:
sudo apt update
sudo apt install -y logrotate
Убедиться, что утилита действительно появилась, можно так:
which logrotate
Обычно путь будет таким:
/usr/sbin/logrotate
Где находятся настройки logrotate
У logrotate есть главный конфигурационный файл и отдельная папка с правилами для разных сервисов.
Основной файл:
/etc/logrotate.conf
Отдельные правила:
/etc/logrotate.d/
Посмотреть содержимое можно так:
sudo nano /etc/logrotate.conf
Или список готовых правил:
ls -l /etc/logrotate.d/
Обычно там уже есть конфиги для Nginx, Apache, apt, rsyslog и других системных сервисов.
Важно: свои правила удобнее создавать не в /etc/logrotate.conf, а отдельным файлом в /etc/logrotate.d/. Так меньше шансов всё запутать.
Как выглядит простое правило logrotate
Допустим, у тебя есть лог приложения:
/var/www/site/logs/app.log
Создадим для него отдельное правило:
sudo nano /etc/logrotate.d/app-log
Вставляем такой конфиг:
/var/www/site/logs/app.log {
daily
rotate 7
compress
missingok
notifempty
create 0640 admin www-data
}
Теперь разберём, что здесь означает каждая строка:
-
/var/www/site/logs/app.log— файл, к которому применяется правило. -
daily— ротация будет выполняться ежедневно. -
rotate 7— хранить 7 старых копий, остальные удалять. -
compress— старые логи будут сжиматься, обычно в.gz. -
missingok— не считать ошибкой, если лог-файл временно отсутствует. -
notifempty— не ротировать пустой лог. -
create 0640 admin www-data— после ротации создать новый лог с правами0640, владельцемadminи группойwww-data.
Это уже рабочее и безопасное правило для большинства простых логов.
Самые важные параметры logrotate
Ниже — параметры, которые используются чаще всего. Их полезно понимать, даже если ты не будешь применять все сразу.
Частота ротации
daily
weekly
monthly
Ротация раз в день, неделю или месяц.
Количество хранимых архивов
rotate 5
Хранить 5 предыдущих версий лога.
Сжатие архивов
compress
Старые логи будут сжаты. Это экономит место.
Если хочешь, чтобы самый свежий архив пока не сжимался, а сжатие шло со следующего — используют:
delaycompress
Ротация только при достижении размера
size 100M
Лог будет ротироваться, когда достигнет 100 МБ.
Есть и более гибкий вариант:
maxsize 100M
То есть ротировать при превышении указанного размера, даже если день/неделя ещё не прошли.
Права и владелец нового файла
create 0640 admin www-data
После ротации создаётся новый лог-файл с нужными правами.
Если лог пустой
notifempty
Пустой файл не трогаем.
Если файл отсутствует
missingok
Не падать с ошибкой, если лог уже удалён или ещё не создан.
Когда нужен copytruncate
Некоторые программы не умеют нормально закрывать и заново открывать лог после ротации. В таких случаях используют параметр copytruncate.
Пример:
/var/www/site/logs/custom.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
Что делает copytruncate:
-
сначала копирует текущий лог в архив;
-
потом обнуляет исходный файл;
-
процесс продолжает писать в тот же файл, не замечая ротации.
Когда использовать:
-
для кастомных скриптов и приложений, которые не умеют переоткрывать лог;
-
если после обычной ротации сервис продолжает писать в старый файл.
Когда не использовать без необходимости:
-
если сервис умеет сам корректно переоткрывать лог после сигнала/перезапуска;
-
если хочешь максимально «чистую» ротацию без риска потерять пару строк в момент копирования.
Ротация логов Nginx: понятный пример
У Nginx обычно есть два главных лога:
/var/log/nginx/access.log
/var/log/nginx/error.log
Смотрим существующее правило:
sudo nano /etc/logrotate.d/nginx
Обычно оно выглядит примерно так:
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -s /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid`
endscript
}
Что здесь важно:
-
/var/log/nginx/*.log— правило применяется ко всем логам Nginx. -
rotate 14— хранить 14 архивов. -
sharedscripts— скрипт внизу выполнять один раз для всей группы логов. -
postrotate ... endscript— после ротации отправить Nginx сигнал, чтобы он переоткрыл лог-файлы.
Это хороший пример того, как logrotate работает вместе с сервисом, а не просто архивирует файл в одиночку.
Как проверить конфигурацию logrotate без риска
Это один из самых важных этапов. Перед тем как надеяться, что всё само заработает ночью, надо проверить правило вручную.
Проверка в режиме отладки
sudo logrotate -d /etc/logrotate.conf
Ключ -d означает debug: утилита покажет, что бы она сделала, но ничего реально не изменит.
Принудительный запуск
sudo logrotate -f /etc/logrotate.conf
Ключ -f означает force: выполнить ротацию принудительно, даже если по расписанию ещё рано.
Полезная схема: сначала всегда -d, потом уже -f, если всё выглядит нормально.
Как logrotate запускается автоматически
На Ubuntu и Debian logrotate обычно запускается автоматически через cron или systemd timer. Отдельно ничего придумывать не нужно.
Проверить наличие таймера можно так:
systemctl list-timers | grep logrotate
Или посмотреть cron-скрипты:
ls -l /etc/cron.daily/logrotate
То есть схема обычно такая:
-
ты создаёшь правило в
/etc/logrotate.d/; -
система сама регулярно запускает
logrotate; -
логи архивируются и старые файлы удаляются по заданным условиям.
Частые ошибки и как их исправить
-
error: unknown option …
Обычно это опечатка в параметре. Например, написали
notifymptyвместоnotifempty. Лечится внимательной проверкой через:sudo logrotate -d /etc/logrotate.conf -
лог не ротируется вообще
Проверь:
-
правильно ли указан путь к файлу;
-
существует ли лог на момент проверки;
-
не пустой ли он, если стоит
notifempty; -
не запускаешь ли ты проверку без
-f, когда ротация ещё «не наступила».
-
-
после ротации сервис перестал писать в лог
Скорее всего, сервис не переоткрывает лог-файл. Нужно либо использовать
copytruncate, либо добавитьpostrotateсо своим сигналом/перезапуском. -
Permission denied
Проверь владельца и права каталога, где лежит лог. Иногда
logrotateне может создать новый файл из-за неверных прав. Помогает параметрcreate ...и корректныйchown.
Практические советы, чтобы не наломать дров
-
Не трогай системные правила без необходимости — лучше делай свой файл в
/etc/logrotate.d/. -
Для своих приложений начинай с простых правил:
daily,rotate 7,compress,missingok,notifempty. -
Перед запуском всегда проверяй конфигурацию через
logrotate -d. -
Если лог пишет активный сервис, убедись, что после ротации он продолжает писать в новый файл.
-
Не ставь слишком большое хранение без причины: логов много, диск не резиновый.
Итоги
-
Разобрались, зачем нужен
logrotateи что такое ротация логов. -
Посмотрели, где лежат основные конфиги и как создавать свои правила в
/etc/logrotate.d/. -
Разобрали ключевые параметры:
daily,rotate,compress,create,copytruncate. -
Научились проверять конфигурацию безопасно через режим отладки и принудительный запуск.
-
Разобрали типичные ошибки и способы их исправления.
Вывод: logrotate — одна из тех утилит, которые тихо делают очень полезную работу. Один раз правильно настроил — и сервер сам следит, чтобы старые логи не разрастались до размеров маленькой катастрофы.