Управление логами с помощью Logrotate

Как настроить Logrotate для управления системными и прикладными журналами.

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

Logrotate решает эту проблему, автоматически архивируя текущие логи и создавая новые файлы для поступающих данных.

Проверка установки

Logrotate предустановлена в большинстве дистрибутивов Linux и запускается автоматически через планировщик cron. Для проверки версии выполните:

logrotate --version

Пример вывода:

logrotate 3.21.0
    Default mail command: /usr/bin/mail
    Default compress command: /bin/gzip
    Default uncompress command: /bin/gunzip
    Default compress extension: .gz
    Default state file path: /var/lib/logrotate/status
    ACL support: yes
    SELinux support: yes

Вывод показывает, какие инструменты Logrotate использует для сжатия и уведомлений, а также путь к файлу состояния с историей ротации.

Структура конфигурации

Конфигурация Logrotate имеет иерархическую структуру. Глобальные параметры задаются в файле /etc/logrotate.conf, а настройки для отдельных приложений размещаются в каталоге /etc/logrotate.d/.

Пример /etc/logrotate.conf на Ubuntu:

# rotate log files weekly
weekly

# use the adm group by default
su root adm

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# use date as a suffix of the rotated file
#dateext

# uncomment this if you want your log files compressed
#compress

# packages drop log rotation information into this directory
include /etc/logrotate.d

Ключевые параметры:

  • weekly — ротация происходит еженедельно.
  • create — после ротации создаётся новый пустой файл лога.
  • rotate 4 — хранятся архивные копии за последние 4 недели.
  • su root adm — ротация выполняется от имени пользователя root и группы adm, что предотвращает проблемы с доступом к системным логам.
  • compress — сжатие архивов (по умолчанию отключено).
  • include /etc/logrotate.d — подключение конфигурационных файлов отдельных приложений.

Для просмотра полного списка директив используйте:

man logrotate

Конфигурации приложений

Файлы в /etc/logrotate.d/ работают по тому же принципу, что и глобальный конфиг, но применяются только к конкретным логам. Параметры внутри этих файлов переопределяют глобальные значения из /etc/logrotate.conf. Если директива не указана в конфигурации приложения — используется глобальное значение.

Пример файла /etc/logrotate.d/nginx:

/var/log/nginx/*.log {
    daily
    missingok
    rotate 14
    compress
    notifempty
}

Если в /etc/logrotate.conf задано rotate 4, а в файле приложения директива rotate отсутствует, логи этого приложения будут ротироваться с сохранением четырёх резервных копий.

Расписание ротации

По умолчанию Logrotate использует временной подход: файлы ротируются по фиксированному расписанию. Поддерживаемые интервалы: hourly, daily, weekly, monthly, yearly.

Logrotate обычно запускается один раз в день через /etc/cron.daily/logrotate. Если требуется почасовая ротация, переместите задачу в cron.hourly:

sudo mv /etc/cron.daily/logrotate /etc/cron.hourly

Для более частого запуска настройте пользовательскую задачу cron.

Ротация по размеру

Для сервисов с непредсказуемым объёмом логов можно задать ротацию по размеру файла.

Директива size — ротация выполняется только при достижении указанного размера, независимо от расписания:

/var/log/app/*.log {
    size 50M
}

Директива size и временные параметры взаимно исключают друг друга — всегда учитывается последняя указанная опция. Если поменять местами size и daily, файлы будут ротироваться ежедневно, а размер игнорироваться.

Директива minsize — ротация выполняется по расписанию, но только если файл достиг минимального размера:

/var/log/app/*.log {
    daily
    minsize 50M
}

Директива maxsize — ротация выполняется сразу, как только файл превысил указанный размер, даже если время ещё не наступило:

/var/log/app/*.log {
    daily
    maxsize 50M
}

Размеры указываются в байтах (по умолчанию), килобайтах (k), мегабайтах (M) или гигабайтах (G).

Методы ротации

Logrotate поддерживает два основных метода работы с активным файлом лога.

create (метод по умолчанию) — переименовывает активный файл (app.logapp.log.1) и создаёт новый пустой файл с оригинальным именем. Рекомендуемый метод, минимизирующий риск потери логов:

/var/log/app/*.log {
    create
    # create 644 appuser group — можно указать права, владельца и группу
}

copytruncate — копирует содержимое текущего файла в архив, затем обнуляет оригинал. Позволяет приложениям продолжать писать в тот же файл. Рекомендуется только для устаревших приложений, не умеющих корректно переоткрывать файлы логов:

/var/log/app/*.log {
    copytruncate
}

Именование архивных файлов

По умолчанию ротационные файлы получают последовательные номера: app.log.1, app.log.2 и т.д. Для добавления временных меток используйте dateext:

/var/log/app/*.log {
    dateext
    # по умолчанию: -%Y%m%d для daily, -%Y%m%d%H для hourly
}

Лог, ротированный 25 июня 2025 года, будет называться app.log-20250625.

Для логов, ротируемых несколько раз в день, можно использовать Unix timestamp:

/var/log/app/*.log {
    dateformat -%Y%m%d-%s
}

Директива dateyesterday ставит дату предыдущего дня — удобно, если обработка происходит после полуночи, а данные относятся к предыдущему дню.

Сжатие

Директива compress включает сжатие через gzip:

/var/log/app/*.log {
    compress
}

Для использования другого архиватора:

/var/log/app/*.log {
    compress
    compresscmd /usr/bin/bzip2
    uncompresscmd /usr/bin/bunzip2
    compressext .bz2
}

delaycompress предотвращает немедленное сжатие последнего ротационного файла — полезно, если приложение продолжает писать в старый файл после ротации:

/var/log/app/*.log {
    compress
    delaycompress
}

compressoptions задаёт уровень сжатия gzip от -1 (быстро, слабое) до -9 (медленно, максимальное):

/var/log/app/*.log {
    compress
    compressoptions -9
}

Диагностика

Файл состояния Logrotate содержит информацию о последней ротации каждого файла:

sudo cat /var/lib/logrotate/status

Для детального анализа используйте режим отладки:

sudo logrotate --debug /etc/logrotate.conf

Помощь

Если у вас возникли вопросы или требуется помощь, пожалуйста, свяжитесь с нами через систему тикетов — мы обязательно вам поможем!

Нужна помощь?Наши инженеры бесплатно помогут с любым вопросом за считанные минутыНаписать нам