Как настроить ротацию журналов в Linux с помощью logrotate

21 Oct 2026, 01:55:49
Журналы системных служб, веб-серверов и приложений постоянно увеличиваются в размере. Если не контролировать их рост, они могут занять всё свободное место на диске и привести к сбоям в работе сервера.
В Linux для автоматического управления журналами используется logrotate. Утилита позволяет регулярно архивировать логи, сжимать старые файлы, удалять устаревшие записи и создавать новые файлы журналов.
В этой статье рассмотрим, как настроить logrotate, создать собственные правила ротации, проверить конфигурацию и устранить распространённые проблемы.

1. Как работает logrotate

Ротация журналов — это процесс, при котором текущий лог переименовывается или архивируется, после чего создаётся новый файл для записи событий.
Например, файл access.log при ротации переименовывается в access.log.1. Если включено сжатие, результат зависит от delaycompress: без него архив сразу получит имя access.log.1.gz, а с ним access.log.1 останется несжатым до следующей ротации и только потом превратится в access.log.2.gz. При следующих ротациях старые архивы удаляются согласно заданным правилам.
Типичная последовательность:
  1. Проверяется, нужно ли выполнять ротацию.
  2. Текущий журнал переименовывается или создаётся его копия.
  3. При необходимости архив сжимается.
  4. Приложению сообщается о необходимости открыть новый файл журнала.
  5. Старые архивы удаляются после достижения установленного количества или срока хранения.
Конфигурация logrotate обычно состоит из глобальных настроек и отдельных правил для конкретных журналов.

2. Установка logrotate

В большинстве дистрибутивов Linux logrotate уже установлен. Проверить наличие утилиты можно командой:
logrotate --version
Если команда не найдена, установите пакет.
Debian / Ubuntu:
apt update
apt install logrotate

AlmaLinux / Rocky Linux / RHEL:
dnf install logrotate
Посмотреть основные файлы конфигурации можно так:
ls -l /etc/logrotate.conf
ls -l /etc/logrotate.d/

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

3. Основные параметры logrotate

Рассмотрим наиболее часто используемые директивы.
Параметр

Назначение

dailyРотация ежедневно
weeklyРотация еженедельно
monthlyРотация ежемесячно
size 100MРотация, если размер файла достиг 100 МБ или превысил его (здесь M означает 1024×1024 байт)
rotate 7Хранить до семи архивных файлов
maxage 30Удалять архивы старше 30 дней при выполнении ротации
compressСжимать архивы, обычно с помощью gzip
delaycompressСжимать предыдущий архив при следующей ротации
missingokНе считать отсутствующий файл ошибкой
notifemptyНе ротировать пустые файлы
copytruncateКопировать файл и обнулять исходный без переоткрытия
createСоздавать новый файл после ротации с заданными правами и владельцем
dateextДобавлять дату к именам архивов
sharedscriptsВыполнять общий скрипт один раз для всей группы файлов
Важно учитывать, что size и временные интервалы работают не как независимые условия «выполнить ротацию по любому из них». Если нужно сочетать время и размер, следует выбрать соответствующую директиву и понимать порядок обработки условий в конфигурации.
Например, daily задаёт временную периодичность, а maxsize 100M позволяет выполнять ротацию раньше, если файл превысил указанный размер при очередной проверке. При этом фактическая частота проверок зависит от планировщика.

4. Настройка ротации отдельного журнала

Допустим, приложение записывает события в файл /var/log/myapp/app.log. Необходимо ротировать журнал ежедневно, хранить семь архивов и сжимать старые файлы.
Создайте конфигурацию:

nano /etc/logrotate.d/myapp
Добавьте следующие правила:
/var/log/myapp/app.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0640 myapp adm
}

Здесь:
  • daily — проверять необходимость ежедневной ротации;
  • rotate 7 — хранить до семи архивных файлов;
  • compress — сжимать архивы;
  • delaycompress — не сжимать самый свежий архив до следующей ротации;
  • missingok — не выдавать ошибку, если файл отсутствует;
  • notifempty — пропускать пустые файлы;
  • create 0640 myapp adm — создавать новый файл с правами 0640, владельцем myapp и группой adm.
Указанные пользователь и группа должны существовать и соответствовать требованиям приложения. Если журнал принадлежит другому пользователю, замените их на фактические значения.
Директива create лишь создаёт новый файл. Если приложение не умеет само переоткрывать журнал, оно продолжит писать в старый файл. В таком случае добавьте блок postrotate с командой, которая заставляет приложение переоткрыть логи, либо используйте copytruncate.
Права на каталог и директива su. Если каталог /var/log/myapp принадлежит не root или доступен на запись группе, logrotate откажется ротировать файлы и выведет сообщение вида
skipping because parent directory has insecure permissions.
Чтобы исправить это, укажите, от имени какого пользователя и группы выполнять ротацию:
/var/log/myapp/app.log {
    su myapp adm
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0640 myapp adm
}

Пример результата

До ротации:
/var/log/myapp/app.log

После нескольких ротаций:
/var/log/myapp/app.log
/var/log/myapp/app.log.1
/var/log/myapp/app.log.2.gz
/var/log/myapp/app.log.3.gz

Конкретные имена и количество файлов зависят от используемых параметров и истории ротации.

5. Как настроить ротацию по размеру файла

Для журналов, которые быстро растут, ежедневной ротации может быть недостаточно. Например, сайт с большим количеством запросов способен сформировать несколько гигабайт access.log за сутки.
Создайте конфигурацию:
/var/log/myapp/app.log {
    size 100M
    rotate 10
    compress
    missingok
    notifempty
    create 0640 myapp adm
}

В этом случае logrotate будет ротировать файл, когда при проверке его размер достигнет или превысит 100 МБ, и хранить до десяти архивов.
Важно: size 100M не запускает ротацию немедленно при достижении порога. Logrotate должен быть запущен планировщиком, чтобы обнаружить превышение размера.
Штатный таймер или cron обычно запускает logrotate один раз в сутки, поэтому на быстро растущем журнале size и maxsize могут сработать слишком поздно: файл успеет вырасти намного выше порога. Чтобы проверки выполнялись чаще, запускайте logrotate каждый час. На системах с systemd переопределите таймер:
systemctl edit logrotate.timer
и добавьте:
[Timer]
OnCalendar=hourly

Для cron поместите скрипт в /etc/cron.hourly/, а в конфигурацию журнала добавьте директиву hourly (если нужна именно почасовая периодичность) или maxsize.
Если требуется ежедневная ротация с дополнительным ограничением по размеру, можно использовать:
/var/log/myapp/app.log {
    daily
    maxsize 100M
    rotate 14
    compress
    missingok
    notifempty
    create 0640 myapp adm
}

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

6. Как ротировать журналы Nginx

Nginx обычно записывает запросы и ошибки в следующие файлы:
/var/log/nginx/access.log
/var/log/nginx/error.log

Во многих дистрибутивах правила ротации Nginx уже находятся в /etc/logrotate.d/nginx.
Проверить их можно командой:
cat /etc/logrotate.d/nginx
Пример собственной конфигурации:
/var/log/nginx/*.log {
    daily
    rotate 14
    missingok
    notifempty
    compress
    delaycompress
    sharedscripts
    postrotate
        if [ -s /run/nginx.pid ]; then
            kill -USR1 "$(cat /run/nginx.pid)"
        fi
    endscript
}

После ротации Nginx получает сигнал USR1, чтобы переоткрыть файлы журналов и продолжить запись в новые файлы.
Путь к PID-файлу зависит от конфигурации системы. Перед использованием примера убедитесь, что /run/nginx.pid существует и содержит PID главного процесса Nginx.
Если готовые правила уже настроены, не создавайте вторую конфигурацию для тех же файлов: это может привести к конфликтам ротации.

7. Что делать, если приложение продолжает писать в старый лог

Одна из распространённых проблем возникает, когда logrotate переименовывает файл, но приложение продолжает держать открытым файловый дескриптор старого журнала.
В результате новый access.log создаётся, однако данные продолжают поступать в архивный файл. Иногда старый файл уже удалён из каталога, но всё ещё занимает место на диске.
Проверить открытые удалённые файлы можно так:
lsof +L1
Если проблема связана с Nginx, обычно достаточно корректно настроить postrotate и отправлять процессу сигнал переоткрытия логов.
Для некоторых приложений можно использовать copytruncate:
/var/log/myapp/app.log {
    daily
    rotate 7
    compress
    copytruncate
    missingok
    notifempty
}

Этот параметр копирует текущий журнал в архив и обнуляет исходный файл без необходимости перезапускать приложение.
Однако между копированием и обнулением возможна потеря части записей. Кроме того, приложение должно открывать журнал в режиме дозаписи (O_APPEND). Иначе после обнуления файла оно продолжит писать с прежней позиции, и в начале файла появятся «дыры» из нулевых байтов. Поэтому для приложений, поддерживающих переоткрытие логов, предпочтительнее использовать штатный механизм приложения, а copytruncate оставлять для случаев, когда другой способ неприменим.

8. Как проверить конфигурацию logrotate

Перед применением новых правил обязательно проверьте конфигурацию.

Проверка без внесения изменений

logrotate -d /etc/logrotate.conf
Параметр -d включает режим отладки: утилита показывает, какие действия планировались бы, но не выполняет ротацию.
Для проверки конкретного файла конфигурации:
logrotate -d /etc/logrotate.d/myapp
Режим -d проверяет синтаксис и логику принятия решений, но не выполняет скрипты prerotate и postrotate. Ошибки в них проявятся только при реальной ротации, поэтому после первого боевого запуска проверьте, что приложение продолжает писать в новый файл.

Принудительный запуск ротации

Для тестирования можно выполнить:
logrotate -vf /etc/logrotate.d/myapp
Параметры:
  • -v — подробный вывод;
  • -f — принудительная ротация независимо от обычного расписания.
Осторожно: принудительный запуск изменяет реальные файлы. Не используйте его на рабочих журналах без понимания последствий. Для предварительной проверки сначала применяйте -d.
При тестировании учитывайте, что отдельный запуск с файлом из /etc/logrotate.d/ использует стандартный файл состояния logrotate, если не переопределить его параметром -s. Поэтому принудительная ротация может повлиять на последующие проверки по расписанию.

9. Когда запускается logrotate

Logrotate обычно запускается автоматически через cron или systemd.
Проверить наличие ежедневного задания можно командой:
ls -l /etc/cron.daily/logrotate
На системах с systemd проверьте таймер:
systemctl status logrotate.timer
Таймер loaded и enabled, статус active (waiting), работает с 11 октября 17:07:56 UTC, то есть чуть больше недели. Это время, когда он был запущен. Триггерит logrotate.service. Красная точка рядом с ним означает, что сервис сейчас неактивен (это нормально для oneshot-сервиса, который отработал и завершился).
Также можно посмотреть расписание таймера:
systemctl list-timers --all | grep logrotate

Таймер logrotate.timer активен и настроен на следующий запуск: Thu 2026-10-22 00:28:49 UTC (через 17 часов). Последний запуск был Wed 2026-10-21 00:46:37 UTC, то есть 6 часов назад. Запускается раз в сутки, ночью. Он запускает сервис logrotate.service.

Не на каждом дистрибутиве используется logrotate.timer: в некоторых системах ротацию запускает cron или другой планировщик.
Если автоматическая ротация не работает, проверьте журналы:
journalctl -u logrotate.service --since "24 hours ago" --no-pager
При использовании cron дополнительно проверьте системные журналы cron и наличие соответствующего задания.

10. Типичные ошибки при настройке logrotate

Журналы не ротируются - проверьте синтаксис конфигурации, состояние logrotate, расписание запуска и права доступа к файлам.
В выводе logrotate есть «skipping because parent directory has insecure permissions» - каталог с журналами принадлежит не root или доступен на запись группе. Добавьте в конфигурацию директиву su пользователь группа либо исправьте права на каталог.
После ротации приложение перестаёт записывать логи - убедитесь, что новый файл создаётся с правильным владельцем и правами, а приложение переоткрывает журнал.
Архивы занимают слишком много места - уменьшите количество хранимых копий, включите сжатие и при необходимости задайте срок хранения.
Файлы журналов продолжают расти без ограничений - проверьте, действительно ли logrotate запускается достаточно часто. При необходимости используйте maxsize и подходящее расписание.
Появляется ошибка duplicate log entry - возможно, один и тот же файл указан в нескольких конфигурациях. Найдите повторяющиеся правила и оставьте только одно.
После удаления старого журнала место не освободилось - проверьте lsof +L1: процесс может продолжать держать удалённый файл открытым.

Заключение

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

Премиум выделенные серверы

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