Логи — один из важнейших инструментов администратора: они помогают отслеживать работу системы, находить ошибки и анализировать поведение сервисов.
Но со временем журналы могут разрастаться, занимая все больше места на диске и превращаясь в неудобные для работы массивы данных. Чтобы избежать хаоса и сохранить контроль над информацией, используется специальный инструмент — logrotate.
Что такое logrotate и зачем он нужен
Logrotate — это системная утилита в Linux, которая предназначена для автоматического управления журнальными файлами. Ее основная задача — предотвращать бесконтрольный рост логов и упрощать работу с ними. Без такой автоматизации логи могут занимать гигабайты дискового пространства, затруднять поиск нужной информации и приводить к сбоям из-за нехватки места.
Зачем он нужен:
- Ротация логов. Logrotate создает новые версии файлов журналов по расписанию, а старые архивирует или удаляет. Это позволяет избежать чрезмерного увеличения размера одного файла.
- Сжатие. Утилита может автоматически упаковывать старые логи, экономя дисковое пространство.
- Хранение истории. Вы сами определяете, сколько архивных файлов нужно оставить: от пары последних копий до подробной истории за несколько месяцев.
- Автоматизация. Процессы, которые администратор раньше делал вручную, теперь выполняются по заданным правилам и без риска ошибок.
- Гибкая настройка. Можно задавать параметры для всей системы или для конкретного приложения.
Где используется logrotate и какие задачи решает
Logrotate применяется практически во всех современных Linux-системах, где есть необходимость в регулярном обслуживании логов. Чаще всего его можно встретить на веб-серверах, почтовых службах, базах данных и приложениях, которые генерируют большой поток логов.
Он встроен в экосистему большинства дистрибутивов и по умолчанию используется для управления системными журналами, поэтому администраторы редко задумываются о том, чтобы искать альтернативу.
Какие задачи решает:
- предотвращает переполнение диска из-за постоянно растущих логов;
- обеспечивает удобную структуру хранения журналов по датам;
- упрощает анализ ошибок и инцидентов благодаря разделению логов на периоды;
- автоматизирует рутину (очистку, сжатие, удаление старых файлов), тем самым снижая нагрузку на администратора;
- помогает соблюдать требования безопасности и аудита, где важно хранение истории событий;
- обеспечивает предсказуемость и порядок в лога.
Как работает logrotate
Принцип работы Logrotate прост: он выполняет заранее заданные сценарии ротации журналов.
Утилита запускается автоматически через cron (или systemd-таймер) и проверяет, какие логи необходимо обработать. В основе лежит конфигурационный файл /etc/logrotate.conf, а также отдельные настройки для каждого сервиса в каталоге /etc/logrotate.d/.
Когда приходит время ротации, Logrotate выполняет несколько последовательных действий:
- Проверка условий. Утилита определяет, нужно ли сейчас обрабатывать файл. Условием может быть период (ежедневно, еженедельно, ежемесячно), размер файла или комбинация этих факторов.
- Создание нового файла. Если условия выполнены, текущий лог закрывается, а на его месте создается пустой файл для продолжения записи.
- Архивация старого лога. Старый файл переименовывается и при необходимости сжимается с помощью gzip или bzip2.
- Очистка по сроку хранения. Если количество архивных копий превысило заданный предел, самые старые удаляются.
- Дополнительные действия. Logrotate может выполнять команды после ротации: например, перезапустить сервис, чтобы он продолжил вести журнал в новый файл.
Где находятся конфигурационные файлы logrotate
Работа Logrotate полностью определяется его конфигурационными файлами. Основной файл настроек располагается по пути:
/etc/logrotate.conf
В нем задаются общие параметры — например, как часто выполнять ротацию, использовать ли сжатие и где хранить архивы. Однако чаще всего используется не только он. Для отдельных сервисов и приложений правила ротации находятся в каталоге:
/etc/logrotate.d/
В нем у каждой программы или службы есть собственный конфигурационный файл. Так, веб-сервер Nginx, почтовый демон Postfix или база данных MySQL будут иметь свои отдельные файлы с параметрами. Это позволяет настраивать ротацию индивидуально под каждое приложение, не изменяя общую конфигурацию.
Важно! При запуске Logrotate сначала считывает настройки из /etc/logrotate.conf, а затем подключает файлы из каталога /etc/logrotate.d/. Благодаря этому можно задавать как глобальные правила, так и точечные — для отдельных логов.
Структура конфигурационного файла
Конфигурационный файл Logrotate построен по простому принципу: в нем указываются пути к логам и правила их обработки.
Простейший блок конфигурации выглядит так:
/var/log/nginx/*.log {
daily
rotate 7
compress
missingok
notifempty
postrotate
systemctl reload nginx
endscript
}
Разберем основные параметры, которые чаще всего применяются:
- daily, weekly, monthly, yearly — задают периодичность ротации: ежедневно, еженедельно, ежемесячно или ежегодно;
- rotate N — определяет, сколько старых файлов хранить (например, rotate 5 оставит пять архивных логов);
- compress / nocompress — указывает, нужно ли сжимать старые файлы (по умолчанию используется gzip).
- delaycompress — откладывает сжатие до следующего цикла, чтобы не архивировать слишком свежие файлы;
- missingok — если файл лога отсутствует, Logrotate не выдаст ошибку и продолжит работу.
- notifempty — предотвращает ротацию пустых логов;
- size N — позволяет запускать ротацию при достижении файлом определенного размера (например, size 100M);
- create mode owner group — создает новый лог с указанными правами доступа и владельцем.
- postrotate … endscript — блок, внутри которого можно выполнить команды после ротации (например, перезапустить сервис, чтобы он начал писать в новый файл).
Начало работы с logrotate
В большинстве популярных Linux-дистрибутивов, включая Ubuntu, утилита Logrotate предустановлена и работает по умолчанию. Однако перед началом настройки стоит убедиться, что она действительно присутствует в системе.
Проверить версию можно командой:
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 в системе отсутствует. В таком случае его нужно установить через пакетный менеджер дистрибутива:
Ubuntu/Debian:
sudo apt install logrotate
CentOS/RHEL:
sudo yum install logrotate
Fedora:
sudo dnf install logrotate
После установки можно сразу переходить к работе: Logrotate автоматически запускается через cron, а все базовые конфигурационные файлы уже находятся в системе.
Как настроить logrotate для конкретного приложения
Logrotate можно использовать не только для системных журналов, но и для логов ваших собственных приложений.
Шаг 1. Создайте приложение, которое пишет логи
Для примера создайте простой скрипт, который будет каждую секунду записывать сообщения в лог-файл.
1. Создайте файл app_logger.sh и добавьте в него следующий код:
#!/bin/bash
logfile="/var/log/myapp/app.log"
generate_log_record() {
local levels=("INFO" "DEBUG" "ERROR")
local modules=("auth" "billing" "api" "storage")
local timestamp=$(date +"%Y-%m-%d %H:%M:%S")
local level=${levels[$RANDOM % ${#levels[@]}]}
local module=${modules[$RANDOM % ${#modules[@]}]}
local msg="Sample log message from ${module} module."
echo "${timestamp} [${level}] ${msg}"
}
while true; do
record=$(generate_log_record)
echo "${record}" >> "${logfile}"
sleep 1
done
2. Теперь сделайте скрипт исполняемым и подготовьте каталог для хранения логов:
chmod +x app_logger.sh
sudo mkdir -p /var/log/myapp
sudo chown -R $USER:$USER /var/log/myapp
3. После этого запустите скрипт:
./app_logger.sh
4. И убедитесь, что логи начали записываться:
tail -f /var/log/myapp/app.log
5. Вы увидите строки вида:
2025-08-30 15:42:10 [INFO] Sample log message from api module.
2025-08-30 15:42:11 [ERROR] Sample log message from billing module.
2025-08-30 15:42:12 [DEBUG] Sample log message from auth module.
Шаг 2. Создайте конфигурацию Logrotate
Способ 1. Стандартная конфигурация
Чтобы логи не разрастались до огромных размеров, настройте для них политику ротации. Для этого создайте отдельный файл конфигурации в каталоге /etc/logrotate.d/.
Откройте его в текстовом редакторе:
sudo nano /etc/logrotate.d/myapp
Добавьте в файл следующие правила:
/var/log/myapp/*.log {
daily
rotate 10
compress
missingok
notifempty
create 0640 root adm
postrotate
systemctl restart myapp.service >/dev/null 2>&1 || true
endscript
}
Разберем их:
- daily — ротация выполняется раз в день;
- rotate 10 — хранится до 10 архивных файлов логов, более старые удаляются;
- compress — старые логи автоматически сжимаются с помощью gzip;
- missingok — отсутствие файла не вызывает ошибок;
- notifempty — пустые файлы не ротируются;
- create 0640 root adm — создается новый лог с правами доступа 0640, владельцем root и группой adm;
- postrotate … endscript — блок для команд, которые выполняются после ротации (в примере — перезапуск службы, чтобы она начала писать в новый файл).
Сохраните файл и закройте редактор.
Способ 2. Независимая конфигурация + cron
В некоторых случаях стандартного расписания Logrotate (раз в день) недостаточно — например, если ваше приложение генерирует очень много логов. Тогда можно создать отдельную конфигурацию, которая будет работать независимо от системной и запускаться через cron с нужной частотой.
Перейдите в домашний каталог и создайте папку для логов приложения:
cd ~
mkdir myapp
Измените в скрипте app_logger.sh путь к файлу лога:
logfile="$HOME/myapp/app.log"
Запустите скрипт снова, чтобы он начал писать в новый каталог:
./app_logger.sh
Создайте файл logrotate.conf в каталоге ~/myapp:
nano ~/myapp/logrotate.conf
Добавьте в него настройки:
/home/<user>/myapp/*.log {
hourly
rotate 6
compress
notifempty
missingok
}
Итак, ротация будет происходить каждый час, храниться будет до 6 архивов, а пустые файлы будут игнорироваться.
Logrotate хранит состояние (дата последней ротации, количество архивов) в специальном файле. Для независимой конфигурации создайте его вручную:
logrotate ~/myapp/logrotate.conf --state ~/myapp/logrotate.state
Посмотреть содержимое можно, выполнив:
cat ~/myapp/logrotate.state
Пример вывода:
logrotate state -- version 2
"/home/<user>/myapp/app.log" 2025-8-30-13:00:00
Откройте редактор cron:
crontab -e
Добавьте строку:
0 * * * * /usr/sbin/logrotate /home/<user>/myapp/logrotate.conf --state /home/<user>/myapp/logrotate.state
Эта запись означает, что Logrotate будет запускаться каждый час в начале часа, используя вашу конфигурацию.
Через час в каталоге ~/myapp/ вы должны увидеть архивные файлы:
app.log
app.log.1.gz
app.log.2.gz
...
Шаг 3. Проверьте конфигурацию Logrotate
После того как вы создали конфигурационный файл, важно убедиться, что Logrotate видит его и будет обрабатывать логи так, как задумано.
1. Тестовый запуск без изменений
Выполните команду с флагом --debug, чтобы Logrotate просто показал, что он собирается делать, не меняя файлы:
sudo logrotate /etc/logrotate.conf --debug
Для независимой конфигурации используйте:
logrotate ~/myapp/logrotate.conf --state ~/myapp/logrotate.state --debug
В выводе вы должны увидеть строку с упоминанием ваших логов, например:
rotating pattern: /var/log/myapp/*.log
after 1 days (7 rotations)
considering log /var/log/myapp/app.log
log does not need rotating (log has already been rotated)
Вывод подтвердит (или опровергнет), что Logrotate распознал ваш файл и учел его в работе.
2. Принудительная ротация
Чтобы проверить процесс полностью, запустите Logrotate с ключом -f:
sudo logrotate -f /etc/logrotate.d/myapp
или для кастомной конфигурации:
logrotate -f ~/myapp/logrotate.conf --state ~/myapp/logrotate.state
Теперь в каталоге логов вы увидите новый архив:
app.log
app.log.1.gz
3. Проверка состояния ротации
Logrotate фиксирует информацию о последних запусках в state-файле. Для системных конфигураций это:
/var/lib/logrotate/status
Для независимых — файл, который вы указали при запуске (~/myapp/logrotate.state).
Чтобы убедиться, что конкретный лог действительно обработан, выполните:
sudo cat /var/lib/logrotate/status | grep myapp
Пример вывода:
"/var/log/myapp/app.log" 2025-8-30-14:00:00
Как изменить системное расписание Logrotate
По умолчанию Logrotate запускается один раз в день. Это значит, что если в конфигурации вы укажете параметр hourly, он фактически не будет работать — ведь сам процесс ротации выполняется только раз в сутки.
Однако это можно изменить. В Linux запуск Logrotate обеспечивается через cron, а именно специальным скриптом. На Ubuntu этот скрипт находится в каталоге:
/etc/cron.daily/logrotate
Путь к нему указывает, что Logrotate вызывается системой один раз в день. Чтобы изменить расписание и заставить Logrotate запускаться каждый час, нужно переместить скрипт в каталог cron.hourly:
sudo mv /etc/cron.daily/logrotate /etc/cron.hourly
После этого Logrotate будет выполняться каждый час вместе с другими заданиями из этого каталога, и опция hourly в конфигурации начнет работать так, как задумано.
Как изменить права доступа при работе Logrotate
По умолчанию Logrotate выполняется от имени пользователя root и группы adm. Это позволяет утилите управлять системными логами, которые требуют повышенных привилегий.
Однако у такого подхода есть свой нюанс: новые лог-файлы, созданные после ротации, будут принадлежать пользователю root и группе adm. В некоторых случаях это мешает самому приложению продолжать запись в файл, так как у него нет нужных прав.
Чтобы избежать подобных проблем, в конфигурации Logrotate используется директива create, которая позволяет задать не только права доступа, но и владельца с группой для новых логов.
Пример:
/etc/logrotate.d/myapp
/var/log/myapp.log {
daily
rotate 7
compress
notifempty
create 644 myuser mygroup
}
В этом примере Logrotate при создании нового файла myapp.log установит:
- права доступа 644 (чтение и запись для владельца, чтение для группы и остальных);
- владельца файла — myuser;
- группу — mygroup.
Благодаря этому приложение, работающее от имени пользователя myuser, сможет продолжать записывать данные в новый лог без ошибок доступа.
Заключение
Logrotate — это инструмент, который позволяет держать логи под контролем, не тратя на это лишнее время и силы. Он снимает рутину с администратора: автоматически архивирует, сжимает и удаляет устаревшие журналы, освобождая место и сохраняя порядок.
Главное — правильно настроить конфигурацию: указать, какие логи обрабатывать, как часто и сколько копий хранить. При этом всегда можно пойти дальше — задать свои сценарии в postrotate, изменить расписание через cron или настроить собственные правила для отдельных приложений.
Если уделить немного внимания начальной настройке, Logrotate будет незаметно работать в фоне и обеспечивать стабильность системы, а вы сможете сосредоточиться на действительно важных задачах.