Ноя 20 2009

Логи Apache в syslog.

Apache пишет логи сам, это сделано из тех соображений, что при большой нагузке отправка записей по UDP(UDP используется протоколом syslog) может терять часть сообщений, ведь UDP протокол не гарантирующий доставку пакетов.
Но у Apcheвского модуля есть возможность отправлять записи на скрипт. Настройки выглядят так:

CustomLog |/usr/local/share/apache22/logging common


/usr/local/share/apache22/logging — это перловый скрипт.
Выглядит он так:

#!/usr/bin/perl
use Sys::Syslog qw( :DEFAULT setlogsock );
 
setlogsock('unix');
openlog('apache', 'daemon', 'local2');
while ($log = <STDIN>) {
syslog('notice', $log);
}
closelog

Для работы скрипта требуется перловый модуль /usr/ports/sysutils/p5-Sys-Syslog/. Я при работе пишу логи с фасилити local2. Можно использовать любой свободный фасилити.
В настройках syslog настройки логирования сообщений с facility2 выглядят так:

local2.*      /var/log/apache.log

Но если вы используете rsyslog, то возможности по логированию значительно возрастают. rsyslog умеет фильтровать сообщения по содержимому.
И если, к примеру, обычный лог в rsyslog.conf, записывающий сообщения с facility2 в лог /var/log/apacheserv.log настраивается так:

if $hostname contains 'apacheserv' and ( $syslogfacility-text contains 'local2') \
then /var/log/apacheserv.log;TraditionalFormat

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

LogFormat "%h %l %u %t http://%v%U %>s %b" common

%v — эта переменная обозначает имя виртуального сервера к которому относится запись. Имя вирутального сервера — это то , что в настройках апача внесено в параметр ServerName.
А настройки rsyslog для виртуального сервера hilik.org.ua я использую такие:

if $hostname contains 'apacheserv' and ( $syslogfacility-text contains 'local2' and $msg contains 'hilik.org.ua') \
then /var/log/hilik.org.ua.log;TraditionalFormat

Этот фильтр определяет, что все сообщения от сервера apacheserv c фасилити local2 и в сообщении содержащий строку hilik.org.ua будет записываться в /var/log/hilik.org.ua.log

На этом настройка закончена.


Украинская Баннерная Сеть