Как автоматически очищать старые логи через logrotate на VPS?

В этой статье разберём:

  • что такое ротация логов и зачем она нужна;
  • где находятся настройки 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 и других системных сервисов.

Основной конфиг logrotate и папка с правилами на VPS

Важно: свои правила удобнее создавать не в /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 для логов Nginx

Как проверить конфигурацию 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 — одна из тех утилит, которые тихо делают очень полезную работу. Один раз правильно настроил — и сервер сам следит, чтобы старые логи не разрастались до размеров маленькой катастрофы.

Оставить комментарий