Бортовой журнал
Бортовой журнал

Логи — один из важнейших инструментов администратора: они помогают отслеживать работу системы, находить ошибки и анализировать поведение сервисов. 

Но со временем журналы могут разрастаться, занимая все больше места на диске и превращаясь в неудобные для работы массивы данных. Чтобы избежать хаоса и сохранить контроль над информацией, используется специальный инструмент — logrotate. 

Что такое logrotate и зачем он нужен

Logrotate — это системная утилита в Linux, которая предназначена для автоматического управления журнальными файлами. Ее основная задача — предотвращать бесконтрольный рост логов и упрощать работу с ними. Без такой автоматизации логи могут занимать гигабайты дискового пространства, затруднять поиск нужной информации и приводить к сбоям из-за нехватки места.

Зачем он нужен:

  • Ротация логов. Logrotate создает новые версии файлов журналов по расписанию, а старые архивирует или удаляет. Это позволяет избежать чрезмерного увеличения размера одного файла.
  • Сжатие. Утилита может автоматически упаковывать старые логи, экономя дисковое пространство.
  • Хранение истории. Вы сами определяете, сколько архивных файлов нужно оставить: от пары последних копий до подробной истории за несколько месяцев.
  • Автоматизация. Процессы, которые администратор раньше делал вручную, теперь выполняются по заданным правилам и без риска ошибок.
  • Гибкая настройка. Можно задавать параметры для всей системы или для конкретного приложения.

Где используется logrotate и какие задачи решает

Logrotate применяется практически во всех современных Linux-системах, где есть необходимость в регулярном обслуживании логов. Чаще всего его можно встретить на веб-серверах, почтовых службах, базах данных и приложениях, которые генерируют большой поток логов. 

Он встроен в экосистему большинства дистрибутивов и по умолчанию используется для управления системными журналами, поэтому администраторы редко задумываются о том, чтобы искать альтернативу.

Какие задачи решает:

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

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

Принцип работы Logrotate прост: он выполняет заранее заданные сценарии ротации журналов. 

Утилита запускается автоматически через cron (или systemd-таймер) и проверяет, какие логи необходимо обработать. В основе лежит конфигурационный файл /etc/logrotate.conf, а также отдельные настройки для каждого сервиса в каталоге /etc/logrotate.d/.

Когда приходит время ротации, Logrotate выполняет несколько последовательных действий:

  1. Проверка условий. Утилита определяет, нужно ли сейчас обрабатывать файл. Условием может быть период (ежедневно, еженедельно, ежемесячно), размер файла или комбинация этих факторов.
  2. Создание нового файла. Если условия выполнены, текущий лог закрывается, а на его месте создается пустой файл для продолжения записи.
  3. Архивация старого лога. Старый файл переименовывается и при необходимости сжимается с помощью gzip или bzip2.
  4. Очистка по сроку хранения. Если количество архивных копий превысило заданный предел, самые старые удаляются.
  5. Дополнительные действия. 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 будет незаметно работать в фоне и обеспечивать стабильность системы, а вы сможете сосредоточиться на действительно важных задачах.