Как управлять журнальными файлами с помощью Logrotate в Ubuntu 22.04

Введение

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

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

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

Предварительные требования

В этом руководстве предполагается, что у вас есть сервер Ubuntu 22.04 с непривилегированным пользователем с возможностью sudo, как описано в Начальная настройка сервера с Ubuntu 22.04.

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

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

Шаг 1 — Подтверждение версии Logrotate

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

  1. sudo apt update
  2. sudo apt install logrotate

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

  1. logrotate --version
Output
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):

  1. man logrotate

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

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

Информация о конфигурации Logrotate обычно находится в двух местах в Ubuntu:

  • /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. Выведем содержимое файла для утилиты пакета apt:

  1. cat /etc/logrotate.d/apt
Output
/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: сохранять двенадцать старых файлов журналов. Это переопределяет стандартное значение rotate 4.
  • monthly: вращать раз в месяц. Это переопределяет стандартное значение weekly.
  • compress: сжимать повернутые файлы. По умолчанию используется gzip, что приводит к появлению файлов с расширением .gz. Команду сжатия можно изменить, используя опцию compresscmd.
  • missingok: не выводить сообщение об ошибке, если файл журнала отсутствует.
  • notifempty: не вращать файл журнала, если он пуст.

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

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

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

Шаг 3 — Настройка примера конфигурации

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

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

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

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

Мы хотим настроить вращение журналов для вымышленного веб-сервера, который помещает access.log и error.log в /var/log/your-app/. Он запускается от имени пользователя и группы www-data.

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

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

Добавьте следующие строки в ваш новый файл конфигурации:

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

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

  1. sudo logrotate /etc/logrotate.conf --debug

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

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

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

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

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

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

  1. nano /home/sammy/logrotate.conf

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

/home/sammy/logrotate.conf
/home/sammy/logs/*.log {
	hourly
	missingok
	rotate 24
	compress
	create
}

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

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

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

  1. cd ~
  2. mkdir logs
  3. touch logs/access.log

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

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

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

logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose
Output
reading config file /home/sammy/logrotate.conf Handling 1 logs rotating pattern: /home/sammy/logs/*.log hourly (24 rotations) empty log files are rotated, old logs are removed considering log /home/sammy/logs/access.log log does not need rotating

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

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

  1. cat /home/sammy/logrotate-state
Output
logrotate state -- version 2 "/home/sammy/logs/access.log" 2022-07-2-19:0:0

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

Если вы хотите заставить Logrotate вращать файл журнала, когда он не делал бы этого, используйте флаг --force:

  1. logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose --force

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

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

  1. crontab -e

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

crontab
14 * * * * /usr/sbin/logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state

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

Сохраните файл и выйдите. Это установит crontab, и наше задание будет запускаться в указанное время.

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

Вывод

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

Source:
https://www.digitalocean.com/community/tutorials/how-to-manage-logfiles-with-logrotate-on-ubuntu-22-04