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

Вступление

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

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

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

Предпосылки

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

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

Для начала войдите на свой сервер как пользователь с поддержкой sudo.

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

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

logrotate --version
Outputlogrotate 3.8.7

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

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

man logrotate

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

Изучение конфигурации 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), с четыре сохраняемых файла журнала (rotate 4) и новые пустые файлы журнала, созданные после ротации текущего (create).

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

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 установлены следующие параметры:

  • rotate 12: сохранить двенадцать старых файлов журнала.

  • monthly: менять раз в месяц.

  • compress: сжать повернутые файлы. по умолчанию используетсяgzip, а файлы заканчиваются на.gz. Команду сжатия можно изменить с помощью параметраcompresscmd.

  • missingok: не писать сообщение об ошибке, если файл журнала отсутствует.

  • notifempty: не переворачивать файл журнала, если он пуст.

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

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

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

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

  1. Создайте новый файл конфигурации Logrotate и поместите его в/etc/logrotate.d/. Это будет выполняться ежедневно от имени пользователяroot вместе со всеми другими стандартными заданиями Logrotate.

  2. Создайте новый файл конфигурации и запустите его за пределами стандартной настройки Ubuntu Logrotate. Это действительно необходимо только в том случае, если вам нужно запустить Logrotate от имени пользователя, отличного отroot, или если вы хотите ротацию журналов чаще, чем ежедневно (конфигурацияhourly в/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

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

/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 запускается до сжатия журналов. Сжатие может занять много времени, и ваше программное обеспечение должно немедленно переключиться на новый файл журнала. Для задач, которым необходимо запуститьafter, журналы сжаты, используйте вместо этого блокlastaction.

After customizing the config to fit your needs и сохранив его в/etc/logrotate.d, вы можете протестировать его, выполнив пробный запуск:

sudo logrotate /etc/logrotate.conf --debug

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

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

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

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

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

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

nano /home/sammy/logrotate.conf

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

/home/sammy/logrotate.conf

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

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

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

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

cd ~
mkdir logs
touch logs/access.log

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

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

В этом примере Logrotate поместит файл состояния прямо в наш домашний каталог. Я могу пойти куда угодно и где угодно:

logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose
Outputreading 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 записал некоторую информацию о запуске:

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

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

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

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

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

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

crontab -e

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

crontab14 * * * * /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 в своем терминале.

Related