Что такое ротация логов (log rotation)?

Что такое ротация логов (log rotation)

Ротация логов — это процесс периодического переименования/перемещения/архивации и очистки файлов журналов, чтобы контролировать их размер, количество и время хранения. Цель — не допустить переполнения диска, уменьшить стоимость хранения и упростить работу с логами (поиск, архивирование, удаление старых записей).

Зачем нужна ротация

  • логи растут бесконечно → занимают весь диск и падают сервисы;

  • удобство работы — меньшие файлы читаются и индексируются быстрее;

  • соответствие требованиям хранения и приватности (ретеншн);

  • контроль затрат на индексацию/хранение;

  • возможность архивировать и сжимать старые логи.

Как работает ротация — основные триггеры и действия

Триггеры:

  • по размеру (например, >100M),

  • по времени (daily, weekly, monthly),

  • по возрасту (старше N дней),

  • по числу ротаций (keep N copies).

Действия при ротации:

  • rename (move) текущего файла в файл с суффиксом (например access.log → access.log.1 или access.log-2025-08-12), затем создать новый пустой файл;

  • copytruncate — скопировать содержимое и затем усечь (truncate) исходный файл (используется, когда приложение не умеет перекрывать файл);

  • compress — сжать старые файлы (gzip/bzip2);

  • delaycompress — сжимать начиная со 2-й ротации (оставить последний незжатым для быстрого доступа);

  • olddir — переместить старые файлы в отдельную папку;

  • postrotate / prerotate — команды, выполняемые до/после ротации (например, послать SIGHUP приложению, чтобы оно открыл новый дескриптор).

Инструменты

  • logrotate (Linux) — стандартный демон для file-based логов; конфигурации /etc/logrotate.conf и /etc/logrotate.d/*.

  • rotatelogs (Apache) — библиотека/утилита для ротации.

  • systemd-journald — имеет собственные ограничения (SystemMaxUse, MaxFileSec).

  • лог-агрегаторы/шипперы (Fluentd, Fluent Bit, Filebeat, Vector) — часто решают ротацию на уровне отправки (шлют логи в централизованное хранилище, где ретеншн управляется централизовано).

  • В контейнерах рекомендуется писать в stdout/stderr и полагаться на лог-драйвер (docker json-file с max-size/max-file) или на централизованный сборщик, а не на локальную ротацию файлов.

Важные нюансы и подводные камни

  • copytruncate безопасно, но теряет atomicity: в короткий момент есть риск дублирования или пропуска строк; более надёжно использовать rename + создание нового файла и сигнализацию процесса.

  • Если приложение держит open file descriptor на старом inode, то простое переименование не освободит диск — файл продолжит занимать место, пока процесс не закроет дескриптор. В таком случае нужно либо перезаписать дескриптор (SIGHUP/reopen), либо restart/реинициализация логгера.

  • Неправильные права/владельцы нового файла → приложение не сможет писать. В logrotate используйте директиву create mode owner group.

  • Сжатие экономит место, но повышает CPU при архивации/распаковке; задержка сжатия (delaycompress) полезна для последних логов.

  • В контейнерах и распределённых системах локальная ротация может быть бессмысленна: логи лучше централизовать и управлять ретеншн там.

Пример конфигурации logrotate

/var/log/myapp/\*.log {
daily
rotate 14
size 100M
compress
delaycompress
missingok
notifempty
copytruncate
create 0640 myuser adm
postrotate
systemctl kill -s HUP myapp.service >/dev/null 2>&1 || true
endscript
}

Лучшие практики

  • писaть структурированные логи и использовать correlation_id;

  • если возможно — логировать в stdout и использовать централизованный шиппер;

  • при file-based логах — prefer rename + сигнал процессу (не copytruncate);

  • задавать разумный retention и проверять free disk space;

  • мониторить метрики ротации: возраст старейшего лога, число файлов, свободное место;

  • автоматизировать проверку успешности postrotate-скриптов и отслеживать ошибки ротации в отдельный лог.

Ротация логов — не только админская утилита, а часть стратегии наблюдаемости и управления инцидентами: без неё рост логов быстро приведёт к operational-проблемам и усложнит расследование.