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

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

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

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

Требования

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

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

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

logrotate --version
logrotate 3.8.7

Если Logrotate не установлен, команда вернет сообщение об ошибке. Пожалуйста, установите утилиту через диспетчер пакетов вашего дистрибутива Linux.

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

man logrotate

2: Конфигурации Logrotate

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

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

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

Откройте конфигурационный файл Logrotate пакета в файле /etc/logrotate.d. Выведите файл пакета apt спомощью команды 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. Параметры, установленные для логов apt:

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

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

man logrotate

3: Создание конфигурационного файла

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

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

Конфигурационный файл в /etc/logrotate.d/

Для примера попробуйте настроить ротацию логов фиктивного приложения, чьи логи access.log и error.log хранятся в /var/log/example-app/. Приложение работает как пользователь и группа www-data.

Чтобы добавить конфигурацию в /etc/logrotate.d/, откройте новый файл.

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

Вот пример конфигурационного файла, который может обрабатывать эти логи.

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

Файл содержит такие директивы:

  • create 0640 www-data www-data: после ротации создает пустой лог с заданными правами (0640), владельцем (www-data) и группой (www-data).
  • sharedscripts: этот флаг означает, что любые скрипты, добавленные в конфигурацию, запускаются только один раз за запуск, а не для каждого файла в ротации. Поскольку эта конфигурация будет соответствовать двум логам в каталоге example-app, скрипт, указанный в postrotate, будет запускаться дважды без этой опции.
  • postrotate – endscript: этот блок содержит скрипт, который нужно запустить после ротации. В этом случае приложение будет перезагружено. Иногда это необходимо, чтобы приложение подключило новые логи. Обратите внимание, что postrotate запускается до сжатия логов. Сжатие может занять много времени, и программное обеспечение должно немедленно переключится на новый лог. Для задач, которые необходимо запустить после того сжатия логов, вместо postrotate используйте блок lastaction.

Откорректируйте конфигурационный файл согласно требованиям и сохраните его в /etc/logrotate.d. Протестируйте его:

sudo logrotate /etc/logrotate.conf --debug

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

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

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

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

Создайте конфигурационный файл:

nano /home/8host/logrotate.conf

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

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

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

Вам нужно откорректировать конфигурацию в соответствии с требованиями приложения.

Чтобы убедиться, что все работает, создайте лог:

cd ~
mkdir logs
touch logs/access.log

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

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

Поместите этот файл в домашний каталог.

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 видит этот файл впервые, но утилита знает, что файл создан недавно, а потому не нуждается в ротации.

Посмотрите на файл logrotate-state, в котором сохранилась информация о запуске Logrotate:

cat /home/8host/logrotate-state
logrotate state -- version 2
"/home/8host/logs/access.log" 2017-11-7-19:0:0

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

Чтобы включить ротацию лога, который, согласно Logrotate, в ротации пока не нуждается, используйте -forceflag:

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

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

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

crontab -e

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

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

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

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

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

Заключение

Теперь вы умеете работать с Logrotate: проверять версию, управлять конфигурацией, создавать пользовательские конфигурационные файлы. Чтобы больше узнать о команде Logrotate, откройте справку:

man logrotate

Tags: ,