Applications: Logrotate, Apache2, Nginx.
Подход к "ротации" журнальных файлов приложений у нас будет свой, основанный на необходимости иметь представление об объёме дискового пространства, потребляемого файлами системы журналирования. Иначе говоря, нам нужно быть уверенным в том, что клиенты - активные "производители событий" не забьют нам диск своими логами. Для этого ограничим размер журнального файла, установим лимит на создание резервных копий и включим сжатие отработанных файлов. Если нужно будет хранить историю событий за длительный период времени, то мы всегда сможем вырезать более старые копии резервных файлов и переместить их на более ёмкий массив для хранения данных.
Устанавливаем приложение, если его ещё нет, которое будет управлять журнальными файлами наших серверов:
# aptitude install logrotate gzip
С настройками "по умолчанию" утилита "logrotate" запускается "cron" как часть ежедневных заданий (в шесть часов двадцать пять минут утра). Если есть желание изменить режим запуска - идем в "/etc/crontab" и делаем это.
Пробежимся по конфигурационному файлу приложения "/etc/logrotate.conf" на предмет обнаружения опций, могущих повлиять на достижение поставленных нами целей. Насколько можно заметить, работа приложения полностью описывается индивидуальными конфигурационными файлами для каждого приложения или группы приложений, чьи журнальные файлы "ротируются", и в общем конфигурационном файле практически нет ничего для нас важного.
Создаем директорию конфигураций logrotate для выделенных приложений, её файлы будут включены в общий конфигурационный файл "/etc/logrotate.conf" директивой "include /etc/logrotate.d":
# mkdir -p /etc/logrotate.d
Создаем конфигурационный файл ротации журнальных файлов для Apache2 (или корректируем имеющийся):
# touch /etc/logrotate.d/apache2
# шаблон указывающий объекты подлежащие "ротации"
/var/log/apache2/*.log /var/www/u*/log/apache.*.log {
# размер журнального файла, после которого он обрабатывается утилитой
size 10M
# отсутствие файла не вызывает ошибку
missingok
# количество хранимых отработанных резервных копий
rotate 10
# указание сжимать отрабатываемые резервные копии
compress
# указание не сжимать первую резервную копию, делать это при повторном проходе
delaycompress
# указание не отрабатывать пустые файлы
notifempty
# добавлять к наименованию файла резервной копии даты в формате "-YYYYMMDD"
dateext
# задать права доступа, владельца и группу создаваемого журнального файла
create 640 root www-ssh
# указание на то, что следующие скрипты исполняются только один раз
sharedscripts
# скрипт указание Apache2 перечитать конфигурацию и перейти на новые "лог" файлы
postrotate
if [ -f "`. /etc/apache2/envvars ; echo ${APACHE_PID_FILE:-/var/run/apache2.pid}`" ]; then
/etc/init.d/apache2 reload > /dev/null
fi
endscript
}
/var/log/apache2/*.log /var/www/u*/log/apache.*.log {
# размер журнального файла, после которого он обрабатывается утилитой
size 10M
# отсутствие файла не вызывает ошибку
missingok
# количество хранимых отработанных резервных копий
rotate 10
# указание сжимать отрабатываемые резервные копии
compress
# указание не сжимать первую резервную копию, делать это при повторном проходе
delaycompress
# указание не отрабатывать пустые файлы
notifempty
# добавлять к наименованию файла резервной копии даты в формате "-YYYYMMDD"
dateext
# задать права доступа, владельца и группу создаваемого журнального файла
create 640 root www-ssh
# указание на то, что следующие скрипты исполняются только один раз
sharedscripts
# скрипт указание Apache2 перечитать конфигурацию и перейти на новые "лог" файлы
postrotate
if [ -f "`. /etc/apache2/envvars ; echo ${APACHE_PID_FILE:-/var/run/apache2.pid}`" ]; then
/etc/init.d/apache2 reload > /dev/null
fi
endscript
}
Создаем конфигурационный файл ротации журнальных файлов для Nginx (или корректируем имеющийся):
# touch /etc/logrotate.d/nginx
/var/log/nginx/*.log /var/www/u*/log/nginx.*.log {
size 10M
missingok
rotate 10
compress
delaycompress
notifempty
dateext
create 640 root www-ssh
sharedscripts
# скрипт указание Nginx перечитать конфигурацию и перейти на новые "лог" файлы
postrotate
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript
}
size 10M
missingok
rotate 10
compress
delaycompress
notifempty
dateext
create 640 root www-ssh
sharedscripts
# скрипт указание Nginx перечитать конфигурацию и перейти на новые "лог" файлы
postrotate
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript
}
Обратим внимание на то, что Nginx после "уведомления" его о смене журнального файла меняет владельца файла с устанавливаемого нами "root" на "www-nginx". Так он хочет, так пусть так и будет.
Проверить верность составления конфигурационного файла можно следующей командой (реальных действий при этом произведено не будет):
# logrotate -d /etc/logrotate.d/apache2
Произвести "форсированную" ротацию журнальных файлов не дожидаясь установленного времени можно с помощью следующей команды:
# logrotate -f /etc/logrotate.d/apache2