Поиск по сайту:

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


Введение

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

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

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

Предпосылки

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

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

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

Подтверждение вашей версии Logrotate

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

  1. logrotate --version
Output
logrotate 3.8.7

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

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

  1. man logrotate

Далее мы рассмотрим структуру конфигурации Logrotate по умолчанию в Ubuntu.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. 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
}

Вот некоторые из новых директив конфигурации в этом файле:

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

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

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

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

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

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

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

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

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

  1. nano /home/sammy/logrotate.conf

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

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

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

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

Чтобы проверить, что это работает, давайте создадим файл журнала:

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

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

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

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

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

  1. cat /home/sammy/logrotate-state
Output
logrotate state -- version 2 "/home/sammy/logs/access.log" 2017-11-7-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

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

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

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

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

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

Заключение

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