Как настроить logrotate в Linux
| Подробности урока | |
|---|---|
| Уровень сложности | Лёгкий |
| Права 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
Если пакет отсутствует, устанавливаем его:
apt update
apt install logrotate
Основной конфигурационный файл находится здесь:
/etc/logrotate.conf
Дополнительные правила для отдельных служб хранятся в каталоге:
/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
}
В данном примере:
/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
Если конфигурация корректна, можно принудительно выполнить ротацию:
logrotate -f /etc/logrotate.conf
Параметр -f заставляет logrotate выполнить ротацию независимо от того, подошло ли время очередной ротации.
Проверка результата
После выполнения ротации можно проверить содержимое каталога:
ls -lah /var/log/
Для конкретного журнала:
ls -lah /var/log/alternatives*
Пример результата:
Автоматический запуск
В современных Debian автоматический запуск logrotate обычно выполняется с помощью systemd timer.
Проверить его состояние можно командой:
systemctl status logrotate.timer
Посмотреть расписание:
systemctl list-timers logrotate.timer
При необходимости службу можно запустить вручную:
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, а уже после этого выполнить ротацию.







