Управление журналами в Linux (logrotate)


Журналы в Linux иногда разрастаются до неприличных размеров, что приводит к снижению производительности и в некоторых особо запущенных случаях может даже вызвать переполнение дискового пространства. К счастью, администратор может использовать утилиту logrotate для управления журналами.

Что это такое?

Logrotate – это утилита, выполняющая ротацию и сжатие файлов протоколов (журналов). При правильной настройке файл журнала никогда не разрастется до огромных размеров. Если же Logrotate не установлена или же неправильно настроена, файлы журналов некоторых сервисов (например, Apache) могут занять все доступное дисковое пространство. По умолчанию Logrotate установлена в Ubuntu 16.04 и настроена для обработки журналов всех установленных пакетов и приложений, в том числе rsyslog.

Настройка Logrotate

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

Конфигурация Logrotate хранится в следующих местах:

  1. Файл /etc/logrotate.conf – основной файл конфигурации. Как правило, он содержит некоторые параметры по умолчанию, настройки для нескольких журналов, не принадлежащим системным пакетам и инструкцию include для подключения конфигурации, хранящейся в файлах каталога /etc/logrotate.d
  2. Каталог /etc/logrotate.d содержит файлы с конфигурацией Logrotate. Здесь вы найдете конфигурацию для rsyslog, apport, dpkg и других системных пакетов. Каждый файл – это конфигурация ротации того или иного журнала. Вы можете добавить свои файлы конфигурации, которые также будут обработаны утилитой Logrotate.

Рассмотрим конфигурацию ротации журналов для apport – файл /etc/logrotate.d/apport:

/var/log/apport.log {
	daily
	rotate 7
	delaycompress
	compress
	notifempty
	missingok
}

Вот что означают все эти параметры:

  1. daily – ротацию выполнять ежедневно (для редко используемых сервисов можно использовать команду monthly – ежемесячно или weekly - еженедельно).
  2. rotate 7 – хранить последние 7 файлов журналов.
  3. compress – сжать обновленные файлы (по умолчанию используется сжатие gzip)
  4. delaycompress – отложить сжатие предыдущего файла журнала до следующего циклического сдвига. Эта директива имеет силу только в комбинации с compress. Это может быть использовано в том случае, если некой программе нельзя указать закрыть ее файл журнала, и таким образом, можно некоторое время продолжать запись в предыдущий файл журнала.
  5. notifempty – не ротировать пустой файл.
  6. missingok – не записывать сообщение об ошибке, если журнал пуст.

Конечно, это далеко не все допустимые параметры конфигурации. О дополнительных вы можете узнать в справке (команда man logrotate).

Теперь представим, что у нас есть некий сервис daemond, хранящий свои файлы журналов в каталоге /var/log/daemond. Нужно настроить ротацию журналов этого сервиса.

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

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

touch /etc/logrotate.d/daemond

Конфигурация может быть такой:

/var/log/daemond/*.log {
daily
missingok
rotate 7
compress
notifempty
create 0640 daemon-data daemon-data
sharedscripts
postrotate
systemctl reload daemond
endscript
}

Первая строчка задает файлы журналов. В нашем случае – это все log-файлы из каталога /var/log/daemond. С первыми пятью командами вы уже знакомы. Команда create определяет, что после ротации будет создан новый пустой файл журнала с правами 0640, владельцем daemon-data и группой daemon-data. Если ваш сервис выполняется от имени какого-то пользователя (например, daemon-data), а не от root, то очень важно указать правильно имя пользователя и группы.

Параметр sharedscripts означает, что скрипт postrotate будет выполняться только один раз, а не после обработки каждого файла.

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

Автоматический запуск Logrotate

Осталось настроить Logrotate на автоматический запуск. Чтобы эта утилита запускалась автоматически, введите команду crontab –e и в появившемся редакторе добавьте строку:

10 * * * * /usr/sbin/logrotate /etc/logrotate.conf

Сохраните файл и выполните выход из редактора. Мы создали расписание планировщика, которое будет выполнять logrotate на 10-ой минуте каждого часа. Конфигурация будет загружаться из файла /etc/logrotate.conf.