Управление логами с помощью Logrotate в Ubuntu

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

Как правило, инструмент Logrotate установлен по умолчанию и базово настроен для обработки ротации логов всех установленных пакетов, включая rsyslog, обработчик системных логов по умолчанию.

В этом мануале мы рассмотрим конфигурацию Logrotate по умолчанию, а затем настроим ротацию логов для простого тестового приложения.

Требования

Для работы вам понадобится виртуальный сервер Ubuntu 22.04 с настроенным пользователем sudo. Подготовить сервер можно по этому руководству.

Logrotate доступен и во многих других дистрибутивах Linux, но конфигурация по умолчанию может сильно отличаться, потому этот мануал не является универсальным и подходит только для Ubuntu 22.04.

Войдите на свой сервер как пользователь sudo, чтобы начать работу.

1: Проверка версии Logrotate

Как мы уже говорили, инструмент Logrotate в Ubuntu установлен по умолчанию. Однако, если по какой-либо причине в вашем случае это не так, вам нужно установить его. Выполните следующие команды, чтобы обновить список пакетов и установить утилиту:

sudo apt update
sudo apt install logrotate

Если вы другой сервер, не Ubuntu, сначала убедитесь, что инструмент Logrotate установлен, запросив информацию о его версии:

logrotate --version

Вы получите такой вывод:

logrotate 3.19.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 установлен, но номер версии значительно отличается, у вас могут возникнуть проблемы с некоторыми параметрами конфигурации, которые рассматриваются в этом руководстве. Обратитесь к документации по вашей версии Logrotate при помощи команды:

man logrotate

Вы также можете ознакомиться с документацией Logrotate онлайн. Далее мы рассмотрим стандартную структуру конфигурации Logrotate в Ubuntu.

2: Изучение конфигурации Logrotate

В Ubuntu информацию о конфигурации Logrotate обычно можно найти в двух местах:

/etc/logrotate.conf: этот файл содержит стандартные параметры и настраивает ротацию для нескольких логов, которые не принадлежат никаким системным пакетам. Он также использует оператор include для извлечения конфигурации из любого файла в каталоге /etc/logrotate.d.

/etc/logrotate.d/: этот каталог содержит конфигурацию Logrotate для всех устанавливаемых вами пакетов, которым требуется помощь в ротации логов. В стандартной установке там уже должны быть файлы для основных системных инструментов, таких как apt, dpkg, rsyslog и так далее.

По умолчанию logrotate.conf настраивает еженедельную ротацию, при этом логи принадлежат пользователю root и группе syslog. Одновременно сохраняются четыре файла (rotate 4), а новые пустые логи создаются после ротации текущего лога (create).

Давайте взглянем на конфигурации пакета Logrotate в /etc/logrotate.d. Это можно сделать с помощью команды cat:

cat /etc/logrotate.d/apt

Вы получите такой вывод:

/var/log/apt/term.log {
  rotate 12
  monthly
  compress
  missingok
  notifempty
}

/var/log/apt/history.log {
  rotate 12
  monthly
  compress
  missingok
  notifempty
}

Этот файл содержит блоки конфигурации для двух разных логов в каталоге /var/log/apt/: term.log и history.log. У них обоих одинаковые параметры. Любые параметры, не установленные в этих блоках, будут наследовать либо значения по умолчанию, либо конфигурации, установленные в /etc/logrotate.conf. Любая настройка в файле logrotate переопределит стандартные параметры logrotate, которые настроены в /etc/logrotate.conf. Давайте рассмотрим, какие параметры установлены для логов apt:

  • rotate 12: сохраняет 12 старых лог-файлов. Этот параметр переопределяет стандартное значение rotate 4.
  • monthly: ротация происходит один раз в месяц. Данный параметр переопределяет значение по умолчанию weekly.
  • compress: сжимает ротируемые файлы. Этот параметр использует gzip по умолчанию, в результате чего вы получите файлы с расширением .gz. Инструмент сжатия можно изменить с помощью параметра compresscmd.
  • missingok: подавляет сообщения об ошибке, если лог отсутствует.
  • notifempty: отключает ротацию лога, если он пуст.

Эти конфигурации также наследуют стандартное поведение create, благодаря чему Logrotate будет создавать новые логи после ротации. Однако это можно легко переопределить с помощью параметра nocreate (хотя это отключит большинство других функций).

В Logrotate доступно еще много опций. Вы можете прочитать обо всех них в документации, набрав man logrotate в командной строке.

Далее мы настроим конфигурационный файл для обработки логов условного сервиса под названием your-app.

3: Настройка Logrotate

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

  1. Можно создать новый конфигурационный файл Logrotate и поместить его в /etc/logrotate.d/. Этот файл будет выполняться ежедневно от имени пользователя root вместе со всеми другими стандартными заданиями Logrotate.
  2. Также можно создать новый конфигурационный файл Logrotate и запустить его за пределами стандартной настройки Logrotate в Ubuntu. Это действительно необходимо только в том случае, если вам нужно запускать Logrotate от имени пользователя без полномочий root или если вы хотите ротировать логи чаще, чем раз в день (почасовая настройка при помощи hourly в /etc/logrotate.d/ будет неэффективной, поскольку системная настройка Logrotate все равно работает только один раз в день).

Давайте рассмотрим оба варианта с некоторыми примерами настроек.

Добавление конфигурации в /etc/logrotate.d/

Допустим, мы хотим настроить ротацию логов вымышленного веб-сервера, который помещает access.log и error.log в /var/log/your-app/. В системе он работает как пользователь и группа www-data.

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

sudo nano /etc/logrotate.d/your-app

Поместите в файл следующие строки:

/var/log/your-app/*.log {
                daily
                missingok
                rotate 14
                compress
                notifempty
                create 0640 www-data www-data
                sharedscripts
                postrotate
                               systemctl reload your-app
                endscript
}

В этом файле есть несколько новых директив:

create 0640 www-data www-data: после ротации создает новый пустой лог с указанными разрешениями (0640), владельцем (www-data) и группой (также www-data).

  • sharedscripts: этот флаг означает, что любые сценарии, добавленные в конфигурацию, запускаются только один раз за один запуск, а не для каждого ротируемого файла. Поскольку путь /var/log/your-app/*.log включает подстановочный знак *, эта конфигурация будет применяться к любому количеству логов приложения. Без опции sharedscripts сценарий, указанный в postrotate, будет запускаться каждый раз, когда logrotate обрабатывает лог.
  • От postrotate до endscript: этот блок содержит сценарий, запускаемый после ротации лога. В этом случае мы перезагружаем наше приложение. Иногда это необходимо, чтобы приложение переключилось на новый лог файл. Обратите внимание, postrotate запускается до сжатия логов. Сжатие может занять много времени, а программное обеспечение должно переключиться на новый лог как можно скорее. Для задач, которые необходимо запустить после сжатия логов, используйте блок lastaction.

Чтобы сохранить файл и выйти из nano, нажмите Ctrl+X, а затем Y и Enter. Вы можете протестировать конфигурационный файл, выполнив пробный запуск:

sudo logrotate /etc/logrotate.conf --debug

Эта команда вызывает logrotate, направляет на стандартный конфигурационный файл и включает режим отладки.

На экране появится информация о том, какие файлы обрабатывает Logrotate и что он с ними сделал. Убедитесь, что вам все подходит. Стандартная задача Logrotate будет запускаться один раз в день с учетом новой конфигурации.

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

4: Создание независимой конфигурации Logrotate

Давайте предположим, что у нас есть приложение, работающее через пользователя 8host и генерирующее логи, которые хранятся в /home/8host/logs/. Мы хотим, чтобы эти логи ротировались ежечасно. Поэтому нам нужно настроить это вне структуры /etc/logrotate.d, предоставляемой Ubuntu.

Сначала мы создадим конфигурационный файл в домашнем каталоге. Откройте его в текстовом редакторе:

nano /home/8host/logrotate.conf

Затем вставьте в него следующую конфигурацию:

/home/8host/logs/*.log {
                hourly
                missingok
                rotate 24
                compress
                create
}

Сохраните и закройте файл. Вы уже встречались со всеми этими опциями на предыдущих этапах, потому давайте просто вкратце подведем итоги: эта конфигурация будет ротировать файлы ежечасно, сжимая и сохраняя двадцать четыре старых лога и создавая новый лог для замены ротированного.

Позже вам нужно будет отладить конфигурацию в соответствии с вашим приложением, но для начала этой конфигурации хватит.

Чтобы проверить, работает ли она, давайте создадим лог-файл. Сначала перейдите в домашний каталог вашего пользователя с помощью команды cd ~. Затем создайте каталог для логов с помощью команды mkdir. После этого создайте в каталоге пустой файл с помощью команды touch. Запустите следующие команды, чтобы выполнить эти действия:

cd ~
mkdir logs
touch logs/access.log

Итак, у нас есть пустой лог в нужном месте, давайте теперь запустим команду logrotate.

Поскольку логи принадлежат пользователю 8host, нам не нужно использовать sudo. Однако нам нужно указать файл состояния. Он записывает, что обнаружил logrotate и какие действия он предпринял при последнем запуске (это нужно, чтобы он знал, что делать в следующий раз). Отслеживание состояния при использовании стандартной конфигурации /etc/logrotate.conf обрабатывается автоматически. Файл состояния хранится в /var/lib/logrotate/status. Поскольку мы не используем стандартную конфигурацию, нам нужно настроить расположение файла состояния вручную.

В этом примере Logrotate поместит файл состояния прямо в домашний каталог. Однако хранить его можно в любом в любом доступном и удобном месте. Выполните следующую команду, чтобы использовать созданный вами файл /home/8host/logrotate.conf и записать в него состояния, с которыми сталкивается logrotate:

logrotate /home/8host/logrotate.conf --state /home/8host/logrotate-state --verbose

Вы получите такой вывод:

reading config file /home/8host/logrotate.conf

Handling 1 logs

rotating pattern: /home/8host/logs/*.log  hourly (24 rotations)
empty log files are rotated, old logs are removed
considering log /home/8host/logs/access.log
  log does not need rotating

Флаг –verbose запрашивает подробную информацию о том, что делает Logrotate. В данном случае Logrotate ничего не ротировал. Это первый раз, когда он сталкивается с этим логом, который был создан совсем недавно, поэтому его не нужно ротировать.

Если мы проверим файл состояния с помощью утилиты cat, то заметим, что Logrotate записал некоторую информацию о запуске:

cat /home/8host/logrotate-state

Вот что мы увидим:

logrotate state -- version 2
"/home/8host/logs/access.log" 2022-07-2-19:0:0

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

Если вы хотите заставить Logrotate ротировать лог вопреки правилам, используйте флаг –force:

logrotate /home/8host/logrotate.conf --state /home/8host/logrotate-state --verbose --force

Это полезно при тестировании постротации и других скриптов.

Осталось настроить cron для ежечасного запуска Logrotate. Откройте crontab вашего пользователя:

crontab -e

Перед вами появится текстовый файл. Если вы впервые используете cron, вам может быть предложено выбрать текстовый редактор по умолчанию. Новичкам обычно рекомендуют использовать nano. В файле уже могут быть комментарии, поясняющие синтаксис cron. Переместите курсор вниз на новую пустую строку в конце файла и добавьте следующее:

14 * * * * /usr/sbin/logrotate /home/8host/logrotate.conf --state /home/8host/logrotate-state

Эта задача будет ежедневно выполняться на 14-й минуте каждого часа. Она запускает почти ту же команду logrotate, которую мы запускали ранее (хотя для безопасности мы расширили logrotate до полного пути, /usr/sbin/logrotate). Использование полных путей при написании заданий cron – хорошая и полезная практика.

Читайте также: Автоматизация задач с помощью Cron

Сохраните файл и выйдите из редактора. Crontab обновится, после чего задача будет выполняться по указанному расписанию.

Если мы вернемся к нашему каталогу логов примерно через час, мы найдем ротированный и сжатый лог access.log.1.gz (или .2.gz, если вы запустили Logrotate с флагом –force).

Итоги

В этом руководстве вы научились проверять версию Logrotate, изучили стандартную конфигурацию Logrotate в Ubuntu и создали два разных типа пользовательских конфигураций. Чтобы узнать больше о параметрах, доступных для Logrotate, вы можете прочитать его документацию, запустив команду manlogrotate в своем терминале. Также ее можно найти онлайн.

Tags: , ,

Добавить комментарий