Skip to content

This article is available in Russian. An English version is on the way.Open the Russian page

Ротация логов: logrotate

Чтобы логи приложения не заполнили диск: правило logrotate, сжатие и проверка без ожидания.

Level
Intermediate
Reading time
2 min read
Updated
Tested on
Ubuntu 22.04, Ubuntu 24.04, Debian 12
Contents
  1. Как он запускается
  2. Правило для своего приложения
  3. Проверьте результат
  4. Частые ошибки

logrotate по расписанию переименовывает текущий лог, сжимает старые и удаляет самые давние. Для системных пакетов (nginx, apt, базы данных) правила уже есть в /etc/logrotate.d. Для своего приложения правило нужно написать самим.

Как он запускается

В Ubuntu и Debian 12 logrotate запускается раз в сутки таймером systemd:

bash
$ systemctl list-timers logrotate.timer

Правило для своего приложения

/etc/logrotate.d/myapp
/var/log/myapp/*.log {    daily    rotate 14    compress    delaycompress    missingok    notifempty    create 0640 deploy deploy    sharedscripts    postrotate        systemctl reload myapp >/dev/null 2>&1 || true    endscript}
  • daily и rotate 14 — ротация раз в день, хранить 14 архивов.
  • compress и delaycompress — сжимать архивы, но последний оставить несжатым: приложение может ещё дописывать в него.
  • missingok и notifempty — не ругаться на отсутствующий файл и не ротировать пустой.
  • create — создать новый файл с указанными правами и владельцем.
  • postrotate — команда, чтобы приложение открыло новый файл. Если приложение этого не умеет, уберите блок и добавьте copytruncate.

Проверьте результат

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

bash
$ logrotate -d /etc/logrotate.d/myapp$ logrotate -f /etc/logrotate.d/myapp$ ls -lh /var/log/myapp/

Частые ошибки

  • «because parent directory has insecure permissions» — каталог с логами доступен на запись группе или всем. Добавьте в правило строку su deploy deploy или исправьте права каталога.
  • После ротации лог пустой, а приложение пишет в архив — не настроен postrotate и нет copytruncate.
  • Логи Docker-контейнеров logrotate не касаются: для них задают max-size в настройках драйвера логов.

Read to the end and the article counts toward your learning progress.

  • логи
  • logrotate
  • ротация
  • диск
  • журналы

Was this article helpful?