Логи 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
На этом настройка закончена.