Укращаем логи — Logrotate

Оригинал статьи

Введение

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

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

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

Предпосылки

Это руководство предполагает, что у вас есть сервер Ubuntu 16.04, с SUDO пользователем с включенной поддержкой некорневого пользователя, как описано в начальной настройке сервера с Ubuntu 16.04.

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

Войдите на свой сервер, как SUDO пользователь.

Определение версии LogRotate

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

logrotate --version

Вывод

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

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

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: Хранить двенадцать старых лог-файлов.
  • monthly: Сделать ротацию один раз в месяц.
  • compress: Сжать повернутые файлы. Используется gzip по умолчанию и приводит к файлам, заканчивающимся на расширение .gz. Команду сжатия можно изменить с помощью опции compresscmd.
  • missingok: Не пишите сообщение об ошибке, если файл журнала отсутствует.
  • notifempty: Не делайте ротацию файла журнала, если он пуст.

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

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

sudo logrotate /etc/logrotate.conf --debug

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

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

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

Создание конфигурации LogRotate

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

Во-первых, мы создадим конфигурационный файл в нашем каталоге. Откройте его в текстовом редакторе:

nano /home/andreyex/logrotate.conf

Затем вставьте следующую конфигурацию:
/home/andreyex/logrotate.conf

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

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

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

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

cd ~
mkdir logs
touch logs/access.log

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

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

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

logrotate /home/andreyex/logrotate.conf --state /home/andreyex/logrotate-state --verbose

Вывод

reading config file /home/andreyex/logrotate.conf

 

Handling 1 logs

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

 

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

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

cat/home/andreyex/logrotate-state

 

Вывод

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

 

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

Если вы хотите заставить LogRotate производить ротацию файла журнала, тогда надо использовать флаг –force:

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

 

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

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

crontab -e

 

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

14 * * * * /usr/sbin/logrotate /home/andreyex/logrotate.conf --state /home/andreyex/logrotate-state

 

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

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

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

Вывод

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

   Отправить статью как PDF