Planetahost VPS
Перейти к основному контенту

Как настроить logrotate в Linux

intro-How-to-configure-logrotate-in-Linux-planetahost.png

Подробности урока
Уровень сложности Лёгкий
Права root Требуются
Требования Терминал Linux
Категория Установка ПО
Совместимость с ОС Debian, Ubuntu
Примерное время чтения  30 мин

Введение

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

В этой статье рассмотрим установку и настройку logrotate в Debian, создание собственного правила для журнала и проверку его работы.

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

При ротации старый журнал переименовывается, а вместо него создаётся новый файл.

Например, исходный журнал:

/var/log/myapp.log

После нескольких ротаций может выглядеть следующим образом:

/var/log/myapp.log
/var/log/myapp.log.1
/var/log/myapp.log.2.gz
/var/log/myapp.log.3.gz

Файл .1 содержит последнюю сохранённую копию журнала. Более старые копии могут автоматически сжиматься в формат .gz. Количество копий и периодичность ротации задаются в конфигурации.

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

Основной файл конфигурации можно открыть командой:

nano /etc/logrotate.conf

В нём могут использоваться следующие параметры:

Параметр Описание
daily Ротация каждый день
weekly Ротация раз в неделю
monthly Ротация раз в месяц
rotate 4 Хранить 4 старые копии
compress Сжимать старые журналы
delaycompress Сжимать журнал начиная со второй старой копии
missingok Не выдавать ошибку, если файла нет
notifempty Не выполнять ротацию пустого файла
copytruncate Обрезать текущий файл после создания его копии
create Создавать новый журнал после ротации
dateext Добавлять дату к имени архивного файла
dateformat Задавать формат даты
size Выполнять ротацию при достижении указанного размера
maxsize Выполнять ротацию при превышении указанного размера
maxage Удалять журналы старше указанного количества дней

Установка и настройка 

В Debian logrotate обычно уже установлен. Проверить его наличие можно командой:

logrotate --version

изображение.png

Если пакет отсутствует, устанавливаем его:

apt update
apt install logrotate

Основной конфигурационный файл находится здесь:

/etc/logrotate.conf

изображение.png

Дополнительные правила для отдельных служб хранятся в каталоге:

/etc/logrotate.d/

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

Создание собственного правила

Предположим, приложение записывает журнал:

/var/log/myapp.log

Создадим для него отдельное правило:

nano /etc/logrotate.d/myapp

Добавим следующую конфигурацию:

/var/log/myapp.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0640 root adm
}

изображение.png

В данном примере:

  • /var/log/myapp.log - путь к журналу, для которого применяется правило.
  • daily - выполнять ротацию журнала ежедневно.
  • rotate 7 - хранить 7 старых копий журнала. После появления восьмой копии самая старая будет удалена.
  • compress - сжимать старые журналы с помощью gzip, чтобы они занимали меньше места.
  • delaycompress - не сжимать последнюю старую копию сразу. Например, myapp.log.1 останется несжатым, а более старые копии будут сжаты.
  • missingok - не считать отсутствие журнала ошибкой. Если файл не существует, logrotate просто пропустит его.
  • notifempty - не выполнять ротацию, если журнал пустой.
  • create 0640 root adm - после ротации создать новый файл журнала с правами 0640, владельцем root и группой adm.

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

myapp.log
myapp.log.1
myapp.log.2.gz
myapp.log.3.gz
myapp.log.4.gz
Ротация по размеру

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

Например:

/var/log/myapp.log {
    daily
    rotate 7
    maxsize 100M
    compress
    missingok
    notifempty
    create 0640 root adm
}

В этом случае журнал проверяется ежедневно, но ротация также может выполняться при превышении размера 100 MB.

Можно использовать параметр size:

size 100M

Он используется как условие ротации по размеру.

Хранение журналов определённое количество дней

Для удаления старых журналов можно использовать параметр maxage.

Например:

/var/log/myapp.log {
    daily
    rotate 30
    maxage 30
    compress
    missingok
    notifempty
    create 0640 root adm
}

В этом случае журналы старше 30 дней будут удаляться.

Добавление даты к имени файла

По умолчанию logrotate использует номера:

myapp.log.1
myapp.log.2.gz
myapp.log.3.gz

При необходимости вместо номеров можно использовать даты. Для этого добавляется параметр:

dateext

Например:

/var/log/myapp.log {
    daily
    rotate 7
    dateext
    compress
    missingok
    notifempty
    create 0640 root adm
}

В результате файлы могут выглядеть следующим образом:

myapp.log
myapp.log-2026-09-14
myapp.log-2026-09-13.gz

Формат даты можно изменить с помощью dateformat:

dateformat -%Y-%m-%d
Если приложение не умеет переоткрывать лог

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

copytruncate

Пример:

/var/log/myapp.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    copytruncate
}

logrotate сначала создаёт копию журнала, а затем очищает исходный файл.

У copytruncate есть небольшой недостаток: между копированием и очисткой файла приложение может успеть записать несколько строк. В таком случае часть записей может не попасть в архив.

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

Выполнение команды после ротации

Иногда после создания нового журнала службе необходимо сообщить, что файл изменился.

Для этого используются блоки postrotate и endscript:

/var/log/myapp.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    create 0640 root adm

    postrotate
        systemctl reload myapp.service
    endscript
}

После ротации logrotate выполнит:

systemctl reload myapp.service

Это позволяет службе начать запись в новый файл.

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

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

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

logrotate -d /etc/logrotate.conf

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

Для более подробного вывода:

logrotate -dv /etc/logrotate.conf

изображение.png

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

logrotate -f /etc/logrotate.conf

Параметр -f заставляет logrotate выполнить ротацию независимо от того, подошло ли время очередной ротации.

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

После выполнения ротации можно проверить содержимое каталога:

ls -lah /var/log/

Для конкретного журнала:

ls -lah /var/log/alternatives*

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

изображение.png

Автоматический запуск

В современных Debian автоматический запуск logrotate обычно выполняется с помощью systemd timer.

Проверить его состояние можно командой:

systemctl status logrotate.timer

изображение.png

Посмотреть расписание:

systemctl list-timers logrotate.timer

изображение.png

При необходимости службу можно запустить вручную:

systemctl start logrotate.service

Обычно вручную запускать logrotate не требуется. После настройки система будет выполнять его автоматически.

Пример готовой конфигурации

Для обычного приложения можно использовать следующую конфигурацию:

/var/log/myapp.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    dateext
    create 0640 root adm
}

Такая конфигурация:

  • выполняет ротацию каждый день;

  • хранит 14 старых копий;

  • добавляет дату к имени архивов;

  • сжимает старые журналы;

  • не выдаёт ошибку при отсутствии файла;

  • пропускает пустые журналы;

  • создаёт новый файл с правами 0640.

Полезные команды

Команда Назначение
logrotate --version Проверить установленную версию
logrotate -d /etc/logrotate.conf Проверить конфигурацию без изменений
logrotate -dv /etc/logrotate.conf Проверить конфигурацию с подробным выводом
logrotate -f /etc/logrotate.conf Принудительно выполнить ротацию
cat /etc/logrotate.conf Посмотреть основную конфигурацию
ls /etc/logrotate.d/ Посмотреть дополнительные правила
systemctl status logrotate.timer Проверить автоматический запуск
systemctl list-timers logrotate.timer Посмотреть расписание

Заключение

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

Полезные ссылки