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

Настройка Logrotate для управления системными и прикладными журналами

При работе с виртуальными серверами или выделенными серверами важно вести учет событий и ошибок для мониторинга и диагностики работы системы.

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

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

В Linux для управления ротацией логов используется утилита 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:

/etc/logrotate.conf
# rotate log files weekly
weekly

# use the adm group by default, since this is the owning group
# of /var/log/.
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).
  • Архивные копии логов хранятся за последние 4 недели (rotate 4).
  • Директива su root adm обеспечивает выполнение ротации от имени пользователя root и группы adm, что предотвращает проблемы с доступом к системным логам.
  • Сжатие (compress) по умолчанию отключено, но его можно включить для экономии дискового пространства.
  • Строка include /etc/logrotate.d указывает Logrotate загружать все конфигурационные файлы из каталога /etc/logrotate.d. Это обеспечивает модульный подход, при котором пакеты определяют свои собственные правила ротации логов, не изменяя глобальные настройки.

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

man logrotate

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

При просмотре содержимого этого каталога можно обнаружить файлы настроек для различных установленных сервисов.

Структура файлов для отдельных приложений похожа на глобальную конфигурацию, но применяется только к конкретным логам:

/etc/logrotate.d/nginx
/var/log/nginx/*.log {
    # Эти директивы применяются только к логам Nginx
    daily
    missingok
    rotate 14
    compress
    notifempty
    # другие настройки, относящиеся к Nginx
}

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

Примечание

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


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

  • hourly (почасово)
  • daily (ежедневно)
  • weekly (еженедельно)
  • monthly (ежемесячно)
  • yearly (ежегодно)

Когда вы указываете один из этих интервалов, Logrotate проверяет, прошло ли с момента последней ротации указанное время. Если да — лог ротируется.


Logrotate часто настроен на уровне всей системы так, чтобы запускаться один раз в день через /etc/cron.daily/logrotate. Если вы используете опцию hourly для конкретного файла лога, необходимо убедиться, что сам Logrotate запускается чаще. Для этого соответствующую задачу cron нужно переместить в путь для почасового выполнения:

sudo mv /etc/cron.daily/logrotate /etc/cron.hourly  # В Ubuntu

Если требуется, чтобы Logrotate запускался ещё чаще, может понадобиться настроить пользовательскую задачу cron.


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

В этом случае можно использовать ротацию по размеру. Директива size сообщает Logrotate, что ротация должна выполняться только тогда, когда файл лога достигнет определённого размера, независимо от временного графика. Например:

/etc/logrotate.d/app
/var/log/app/*.log {
  daily    # теперь игнорируется
  size 50M # учитывается последняя указанная опция
}

Такая настройка гарантирует, что указанный файл лога будет ротироваться только при превышении 50 МБ, даже если дневной интервал уже выполнен. Размеры можно указывать в байтах (по умолчанию), килобайтах (k), мегабайтах (M) или гигабайтах (G).

Важно

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


Для более гибкого управления Logrotate предоставляет директивы minsize и maxsize, которые работают вместе с временными графиками:

  • minsize — ротация выполняется только если достигнут минимальный размер файла при соблюдении временного интервала:
/etc/logrotate.d/app
/var/log/app/*.log {
  daily
  minsize 50M
}

Здесь лог ротируется ежедневно, но только если его размер не менее 50 МБ. Если при проверке файл меньше, ротация произойдёт позже, когда условие будет выполнено.

  • maxsize — ротация выполняется сразу, как только файл превышает указанный размер, даже если время ещё не наступило. Также ротация произойдёт в запланированное время, если предел maxsize не превышен:
/etc/logrotate.d/app
/var/log/app/*.log {
  daily
  maxsize 50M
}

Эти опции позволяют избежать слишком частой ротации маленьких файлов (minsize) и предотвратить чрезмерный рост больших файлов до следующего планового времени (maxsize).


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

/var/log/app/*.log {
  create
  # Можно указать права, владельца и группу:
  # create 644 <appuser> <group>
}
  • create (метод по умолчанию) переименовывает активный файл, например app.logapp.log.1, и создаёт новый пустой файл с оригинальным именем. Новый файл наследует атрибуты старого файла, но их можно указать явно. Метод является предпочтительным, так как минимизирует риск потери логов при условии, что приложение умеет сразу писать в новый файл.

  • copytruncate копирует содержимое текущего файла в ротационный файл, а затем обнуляет оригинальный файл:

/etc/logrotate.d/app
/var/log/app/*.log {
  copytruncate
}

Этот метод позволяет приложениям продолжать писать в тот же файл с тем же дескриптором.

Примечание

Метод copytruncate рекомендуется только для устаревших приложений, которые не могут корректно закрывать и открывать файлы логов.

Logrotate также поддерживает директиву copy, которая копирует файл без обнуления оригинала — полезно для отдельных сценариев, но не заменяет create или copytruncate для постоянного логирования.


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

Директивы dateext и dateformat позволяют добавлять временные метки:

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

Примечание

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

Если лог ротируется несколько раз в день (size-based или hourly), можно использовать Unix timestamp для уникальности:

/var/log/app/*.log {
    dateformat -%Y%m%d-%s  # создаёт app.log-20250625-1748181385
}

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


Сжатие экономит место на диске. Директива compress использует gzip:

/etc/logrotate.d/app
/var/log/app/*.log {
    compress
}

Можно использовать и другие архиваторы через compresscmd, uncompresscmd и compressext:

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

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

/etc/logrotate.d/app
/var/log/app/*.log {
    compress
    delaycompress
}

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

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

Если ротация не работает, проверьте:

  • права доступа
  • ошибки в конфигурации
  • конфликты по времени

Файл состояния Logrotate (/var/lib/logrotate/status) содержит информацию о последней ротации файлов:

sudo cat /var/lib/logrotate/status

Для более детального анализа используйте debug mode:

sudo logrotate --debug /etc/logrotate.conf
Нужна помощь?Наши инженеры бесплатно помогут с любым вопросом за считанные минутыНаписать нам