Logrotate — Ротация логов.

Установка, настройка, эксплуатация.
Ответить
Аватара пользователя
root
Site Admin
Сообщения: 501
Зарегистрирован: 15 авг 2026 01:31

Logrotate — Ротация логов.

Сообщение root »

Оглавление
Темы
О Logrotate
Проверка и тестирование logrotate
Перевод logrotate с cron на systemd
Примеры использования
Описание параметров
Утилита logrotate предназначена для упрощения администрирования файлов журнала в системе, которая генерирует много логов. Logrotate позволяет автоматическое сжатие, удаление и рассылку логов. Logrotate можно настроить для обработки файла журнала ежедневно, еженедельно, ежемесячно или когда файл журнала достигает определенного размера.
Основным файлом конфигурации для logrotate, который устанавливает параметры по умолчанию, является /etc/logrotate.conf. Дополнительные файлы конфигурации включаются в основной из каталога /etc/logrotate.d. Значения, установленные в файлах конфигурации приложения, переопределяют те же параметры в основном файле конфигурации.
Аватара пользователя
root
Site Admin
Сообщения: 501
Зарегистрирован: 15 авг 2026 01:31

Сообщение root »


Чтобы проверить правильность работы logrotate, выполните следующую команду, которая будет выводить отладочную информацию:

Код: Выделить всё

logrotate -d
Чтобы протестировать скрипт logrotate, например ваш скрипт logrotate для Apache в каталоге /etc/logrotate.d, используйте:

Код: Выделить всё

logrotate -f -v /etc/logrotate.d/httpd
Проверка статуса logrotate

Код: Выделить всё

cat /var/lib/logrotate/logrotate.status
Аватара пользователя
root
Site Admin
Сообщения: 501
Зарегистрирован: 15 авг 2026 01:31

Сообщение root »


Для периодического запуска logrotate в CentOS по умолчанию используется Cron. Для перевода logrotate на systemd нужно сделать несколько простых вещей
1) Переносим скрипт запуска logrotate из /etc/cron.daily в /sbin/my-script например и перезапускаем CRON

Код: Выделить всё

mv /etc/cron.daily/logrotate /sbin/my-script/
systemctl restart crond.service
2) Создаём timer для systemd
ВНИМАНИЕ!!! юниты systemd, написанные самостоятельно администратором, нужно размещать в каталоге /etc/systemd/system/. Сюда также помещаются изменённые юниты, чтобы при обновлении не потерять изменения
e /etc/systemd/system/logrotate.timer
примерно такого содержания

Код: Выделить всё

[Unit]
Description=Run on 23:59 Rotate log files

[Timer]
OnCalendar=23:59
Persistent=true

[Install]
WantedBy=timers.target
и файл logrotate.service

Код: Выделить всё

[Unit]
Description=Rotate log files

[Service]
Type=oneshot
ExecStart=/sbin/my-script/logrotate
StandardOutput=syslog
3) Активируем и запускаем таймер. Файл .service идёт как вторая часть к .timer

Код: Выделить всё

systemctl enable --now logrotate.timer
Аватара пользователя
root
Site Admin
Сообщения: 501
Зарегистрирован: 15 авг 2026 01:31

Сообщение root »


И наконец приведу пару примеров скриптов logrotate для Apache и iptables
cat /etc/logrotate.d/httpd

Код: Выделить всё

"/var/www/*.free-adm.ru/log/*.log"
"/var/log/httpd/*.log" {
        # кол-во хранимых сжатых фрагментов
        rotate 7
        # максимальный размер несжатого файла; пока размер текущего
        # файла журнала не превысит данный порог, файл не будет заменён новым
        size=16M
        # отсутствие файла не является ошибкой
        missingok
        # не сбрасывать файл журнала после копирования
        nocopytruncate
        # не создавать пустой журнал
        nocreate
        # не откладывать сжатие файла на следующий цикл
        nodelaycompress
        # не отправлять содержимое удаляемых (старых) журналов по почте
        nomail
        # не обрабатывать пустые файлы
        notifempty
        # держать все файлы в одном и том же каталоге
        noolddir
        # сжимать
        compress
        postrotate
                systemctl reload httpd.service > /dev/null 2>/dev/null || true
        endscript
        # Между postrotate и endscript расположены команды интерпретатора, исполняемые непосредственно 
        # после ротации. В данном примере сюда помещена команда, перезапускающая httpd-сервер. 
        # Это необходимо для нормальной процедуры
}
Допускается перечисление каталогов, а так же группировка при помощи символов подстановки "*", "?"
cat /etc/logrotate.d/iptables

Код: Выделить всё

/var/log/fw/fw.log{
        # – выполнять проверку каждый день;
        daily
        # – количество копий старых логов;
#       rotate 5
        # – не писать сообщения в stdout, если файл отсутствует;
        missingok
        # – не выполнять никаких действий, если файл пустой;
        notifempty
        # – сжимать gzip;
        compress
        # – размер файла, при достижении которого он будет сжат и сохранён как старый
        size 10M
        create 0644 root root
        #postrotate
        #        service rsyslog restart > /dev/null
        #endscript
}
Тестирование отдельных конфигурационных файлов logrotate

Код: Выделить всё

logrotate --force /etc/logrotate.d/httpd
Аватара пользователя
root
Site Admin
Сообщения: 501
Зарегистрирован: 15 авг 2026 01:31

Сообщение root »


Настройка интервалов ротирования журнала
Если задано значение еженедельно, журналы чередуются, если день текущей недели меньше, чем день недели последнего чередования (т. е. понедельник меньше пятницы) или если последний черед произошел более чем за неделю до настоящего времени.
Чтобы настроить ротацию ежемесячного журнала, используйте следующую директиву: Журналы с этим значением будут вращаться каждый месяц, когда запускается logrotate.
Для годовой ротации: Журналы чередуются, если текущий год отличается от даты последнего чередования.

Для ротирования в зависимости от размера используйте следующую директиву:

Код: Выделить всё

size [value]
Директива size вызывает ротацию журнала, когда размер файла журнала превышает указанное [значение]. По умолчанию [значение] предполагается в байтах. Добавьте k к [value], чтобы указать размер в килобайтах, M для мегабайт или G для гигабайт. Например, размер 100k или размер 100M являются действительными директивами.
Сжатие ратированных (старых) Журналов

Код: Выделить всё

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

Код: Выделить всё

compresscmd xz
По умолчанию logrotate сжимает файлы с помощью команды gzip. Вы можете заменить это другим инструментом сжатия, таким как bzip2 или xz, в качестве аргумента директивы compresscmd.
Отложенное сжатия файла журнала

Код: Выделить всё

delaycompress
В некоторых ситуациях не идеально сжимать файл журнала сразу после ротации, когда файл журнала требует дополнительной обработки. Указанная выше директива delaycompress откладывает сжатие на один цикл вращения.
Управление расширением файла журнала
Logrotate добавит число к имени файла, поэтому файл access.log будет повернут к access.log.1. Чтобы убедиться, что расширение поддерживается, используйте следующую директиву:

Код: Выделить всё

extension log
Если вы включите сжатие, сжатый журнал будет называться access.1.log.gz.
Права доступа к файлу журналу
Если ваш процесс-демон требует, чтобы файл журнала существовал для правильной работы, logrotate может помешать, когда он вращает журналы. В результате, logrotate может создавать новые, пустые файлы журнала после ротации. Рассмотрим следующий пример:

Код: Выделить всё

create 640 www-data users
В этом примере создается пустой файл с разрешениями 640 (право чтения / записи владельца, чтение группы, другое нет), которыми владеют пользовательские данные www и в группе пользователей. Эта директива определяет параметры в форме: create [mode (восьмеричное)] [owner] [group].
Ответить