LINUX.ORG.RU
решено ФорумAdmin

lighttpd и фильтры для syslog-ng


0

0

Хочу чтобы lighttpd писал логи доступа и ошибок через syslog-ng.
в конфиг lighttpd добавлено accesslog.use-syslog = «enable»
строчки syslog-ng.conf:
destination http_access { file(«/var/log/http/acces_log» template(«$MESSAGE\n»)); };
filter http_access_f { program(lighttpd); };
log { source(src); filter(http_access_f); destination(http_access); };

Но, если добавить в конфиг lighttpd параметр server.errorlog-use-syslog = «enable», то данная конструкция валит errors и access в один файл. Как правильно разрулить их в разные файлы? Может кто уже такое делал? По какому параметру можно различить логи ошибок и доступа?
Подозреваю, что никак, надо воротить фильтр с regexp'ами, но как грамотно это сделать?

Итак, найдены костыли:

/etc/lighttpd/syslog_pipe_access:

#!/usr/bin/perl
    use Sys::Syslog qw( :DEFAULT setlogsock );

    setlogsock('unix');
    openlog('lighttpd', '', 'local0');

    while ($log = <STDIN> ) {
                syslog('info', $log);
    }
    closelog;

lighttpd.conf:
accesslog.filename = «| /etc/lighttpd/syslog_pipe_access»

syslog-ng.conf
destination http_access { file(«/var/log/http/acces_log» template(«$MESSAGE\n»)); };
filter http_access_f { program(lighttpd) and level(info); };
log { source(src); filter(http_access_f); destination(http_access); };

Аналогичная система для вывода ошибок:

/etc/lighttpd/syslog_pipe_errors:

#!/usr/bin/perl
    use Sys::Syslog qw( :DEFAULT setlogsock );

    setlogsock('unix');
    openlog('lighttpd', '', 'local0');

    while ($log = <STDIN> ) {
                syslog('err', $log);
    }
    closelog;
lighttpd.conf:
server.errorlog =«| /etc/lighttpd/syslog_pipe_errors»

/etc/syslog-ng/syslog-ng.conf
destination http_errors { file(«/var/log/http/error_log» template(«$MESSAGE\n»)); };
filter http_errors_f {program(lighttpd) and level(err); };
log { source(src); filter(http_errors_f); destination(http_errors); };

Может, есть вариант правильнее и грамотнее?

Marmirus ★★ ()
Ответ на: комментарий от Marmirus

А чем syslog-ng столь хорош, чтобы хотеть логгировать через него? А то я по привычке всё на metalog сижу, а httpd-логи пишутся самими web-серверами.

KRoN73 ★★★★★ ()
Ответ на: комментарий от KRoN73

Изначальная идея в том, чтобы вести все логи через syslog.
Мотивы следующие:
1. Желание решить проблему, так сказать, «в целях повышение образованности» (с)
2. Возможно, в дальнейшем захочу перенаправлять все логи на другую машину или базу данных
3. Фильтры. Широкие возможности в управлении содержимым лог-файлов.
4. Использование ресусрсов. Отдавать логи в сокет а затем разруливать их одним процессом, ИМХО, эффективнее, чем каждому процессу напрямую обращаться к диску.

Чем syslog-ng лучше metalog - наверное, ничем, возможно, даже хуже. В данном случае важна сама концепция, а не инструмент.

Marmirus ★★ ()
Ответ на: комментарий от KRoN73

Почитал про metalog, он не умеет писать логи на удалённую машину.

Marmirus ★★ ()
Ответ на: комментарий от Marmirus

Кстати, сорри за оффтоп, а syslog-ng умеет передавать логи на пайп другой программе, как это делает лайти в посте выше?

nnz ★★★★ ()
Ответ на: комментарий от nnz

Умеет.
destination d_script { program(«/path/to/script/script»); };
destination d_pipe { pipe(«/path/to/pipe»); }; предварительно сделав mkfifo /path/to/pipe

Marmirus ★★ ()

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

echo test | /etc/lighttpd/syslog_pipe_access даёт строку в /var/log/http/acces_log начинающуюся с пробела.

Но, вроде же это не смертельно?

Marmirus ★★ ()
Ответ на: комментарий от Marmirus

>destination d_script { program(«/path/to/script/script»); };

Данные передаются именно через пайп? Или через аргументы?

nnz ★★★★ ()
Ответ на: комментарий от Marmirus

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

Попробуй

#!/usr/bin/perl 
    use Sys::Syslog qw( :DEFAULT setlogsock ); 
 
    setlogsock('unix'); 
    openlog('lighttpd', '', 'local0'); 
 
    while (<STDIN> ) { 
                s/^\s+//;
                syslog('err', $_); 
    } 
    closelog;

Если пробелы останутся, значит, это косяк модуля Sys::Syslog либо syslog-ng.

nnz ★★★★ ()
Ответ на: комментарий от nnz

Спасибо.
Сижу и офигеваю. Теперь я знаю почему и как изобретаются велосипеды и костыли, которые ненужны.
Всего делов-то было... Оказывается, lighttpd по дефолту шлет в syslog сообщения как facility - daemon и приоритеты, соответственно, для ошибок - err, а для доступа - info. Всего-то нужно было правильно настроить фильтры.
filter http_errors_f {program(lighttpd) and level(err); };
filter http_access_f {program(lighttpd) and level(info); };

Я, честно, не знаю, чем думал и как так глупо могло получиться...

Marmirus ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.