Вступление
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.
Далее мы настроим файл конфигурации для обработки журналов для вымышленной службы.
Настройка примера конфигурации
Для управления файлами журналов приложений за пределами предварительно упакованных и предварительно настроенных системных служб у нас есть два варианта:
-
Создайте новый файл конфигурации Logrotate и поместите его в
/etc/logrotate.d/
. Это будет выполняться ежедневно от имени пользователяroot вместе со всеми другими стандартными заданиями Logrotate. -
Создайте новый файл конфигурации и запустите его за пределами стандартной настройки 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
в своем терминале.