Ротация логов веб-сервера Apache на ОС Ubuntu

В этом посте расскажу про ротацию логов на веб-сервере. Я буду рассказывать на примере веб-сервера Apache установленного на операционной системе Linux Ubuntu. Инструментов для ротации логов достаточно много, я поведаю о наверное самом популярном — logrotate.

Логи веб-сервера надо как-то автоматически обрабатывать, чтобы они не разрастались до неимоверных размеров. Для начала установим программу logrotate:

apt-get install logrotate

Эта утилита есть в Ubuntu по-умолчанию, поэтому ничего устанавливать, возможно, не понадобится. Убедитесь, что logrotate есть у вас в системе.

Приступим к его настройке. Для этого создадим новый файл конфигурации:

nano /etc/logrotate.d/mysites

Туда вставим, что-то вроде этого:

# путь к файлам логов первого сайта
/home/sites/site1/logs/*.log
/home/sites/site2/logs/access.log

# логи второго сайта
/home/sites/site2/logs/error.log {
	# ротация файлов под достижению указанного размера, можно указать периодичность (день, неделя, месяц)
	size 10M
	# сжимать копию лога, по-умолчанию для этого используется архиватор gzip, хотя можно прицепить и какой-то внешний
	compress
	# сжимать последнюю копию только при следующей ротации, это удобно, потому что самые свежие логи не придётся разархивировать
	delaycompress
	# не ротировать лог, если он пуст
	notifempty
	# не проверять наличие файла (если лога нет, то ничего страшного)
	missingok
	# количество сохраняемых копий
	rotate 5
	# сразу после ротации старого создать новый пустой лог, указываются, соответственно, права доступа, юзер и группа файла
	create 644 root root
	# запустить скрипт или утилиту после ротации всех логов
	sharedscripts
	# выполнить далее указанный скрипт сразу после ротации
	postrotate
	# Скрипт на перезагрузку Апача
		if [ -f "`. /etc/apache2/envvars ; echo ${APACHE_PID_FILE:-/var/run/apache2.pid}`" ]; then
			/etc/init.d/apache2 reload > /dev/null
		fi
	# признак окончания вызова скрипта
	endscript
}

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

Перед запуском работы утилиты предлагаю её протестировать, т.е. запустить в режиме отладки. При запуске logrotete передаём ему в качестве аргумента наш файл конфигурации:

sudo logrotate -d /etc/logrotate.d/mysites

Если всё в порядке, то запускаем программу для работы:

sudo logrotate -v -f /etc/logrotate.d/mysites

Теперь ротация логов будет работать как часы. Утилита logrotate будет автоматически запускаться через cron каждый день и проверять файлы логов. Дополнительно настраивать планировщик cron не требуется, там уже всё было прописано при установке logrotate в системе.

Краткие сведения по logrotate

Для полноты картины, ниже приведу основные сведения для работы с утилитой. За подробностями всегда можно обратиться к мануалу:

man logrotate

Основные ключи запуска Logrotate

При запуске logrotate из командной строки допускаются следующие опции (список не полный):

  • -d. Всключает режим отладки, а так же дублирует опциию -v. В режиме отладки никаких действий с логами не будет выполнено.
  • -f, —force. Заставляет logrotate выполнить ротацию логов. Бывает необходимо после добавления новых конфигурационных файлов или если старый лог файл был удалён вручную; таким образом будут созданы новые лог-файлы и журналирование будет корректно продолжено.
  • -m, —mail command. Указывает, какую команду использовать для отправки журналов по почте. Команда должна принимать 2 входных параметра:
    • заголовок письма
    • получателя письма

    После этого команда должна прочитать сообщение со стандартного входа (STDIN) и отправить его получателю. Командой по умолчанию является /usr/bin/mail -s

  • -s, —state statefile. Указывает на использование альтернативный файл состояния. Полезно в случаях, когда logrotate работает от имени разных пользователей для различных наборов лог-файлов. Дефолтный файл состояния: /var/lib/logrotate/status
  • —usage. Выводит краткую инструкцию по использованию утилиты.
  • -v, —verbose. Вывод диагностических сообщений во время ротации.

Параметры настроек logrotate

Для справки приведу данные по остальным директивам (параметрам) настроек logrotate.

Параметр Описание
rotate <число> Количество хранимых файлов
dailyweekly
monthly
Производить ротацию раз в день/неделю/месяц
size <байт>size 1000
size 100k
size 1M
Производить ротацию если log-файл превысил указанный размер
байт
Кбайт
Мбайт
start <число> число с которого начнётся нумерация файлов
compress Архивировать файлы (по умолчанию gzip)
nocompress Отключает compress
delaycompress Не сжимать ‘свеже’ созданный архив. Например access.log.1 не будет зжат.Используется с compress
create <права><владелец><группа>create 640 root root После ротации создать пустой log-файл. Любые из этих атрибутов могут быть опущены,в этом случае вместо них для нового файла будут использованы атрибуты, имеющие те же значения, что и первоначальный log-файл
nocreate Не создавать файл
copy Создать копию оригинального log-файла, не изменяя его. Исключает create
nocopy Отключает copy
copytruncate Создать копию оригинального log-файла, а потом его ‘обнулить’.Таким образом сам файл не удаляется.
Исключает copy, create
ifempty Архивирует даже пустой файл (используется по умолчанию)
notifempty Не архивировать пустые файлы
missingok В случае отсутствия оригинального log-файла не вызовет ошибку
nomissingok В случае отсутствия оригинального log-файла вызовет ошибку
postrotate<команды>
endscript
Строки, находящиеся между postrotate и endscriptбудут выполнены как sh скрипт после архивирования log-файла
prerotate<команды>
endscript
Аналогично postrotate, только действия будут выполнены до начала архивирования
sharedscripts Скрипты postrotate и prerotate будут выполнены только один раз в рамках своей секции.
nosharedscripts Отключает sharedscripts.Скрипты будут выполняются при ротации каждого log-файла, при определение /var/log/apache2/*.log скрипт будет выполнен столько раз сколько уникальных log-файлов будет находится в данной директории
olddir <путь>olddir /home/logs Перемещать архивные файлы в указанную директорию
noolddir Отключает olddir

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