Log4j & syslog-ng: пишем в syslog из java-приложений

Date October 19th, 2010 Author Vitaly Agapov

Никаких нестандартных решений здесь не требуется, однако ж я сумел потратить на эту задачу достаточно ощутимый объём времени. В основном, конечно, проблемы были связаны с тем, что при необходимости писать большое количество разных логов в разные файлы протокол syslog позволяет использовать очень ограниченное количество facilities (для нестандартного использования – всего восемь), отчего пришлось использовать шаблоны.

Финальный результат выглядит примерно так…

В конфиг-файле log4j описываем аппендер:

01.<appender name="SYSLOG" class="org.apache.log4j.net.SyslogAppender">>
02.    <param name="Threshold" value="ALL" />
03.    <param name="SyslogHost" value="192.168.0.1" />
04.    <param name="Facility"  value="local1"/>
05.    <param name="FacilityPrinting"  value="true"/>
06.    <layout>
07.        <param name="ConversionPattern" value="SOME_TEMPLATE %d %-5p [%c] %m%n" />
08.    </layout>
09.</appender>

Само собой, для log4j должен быть определён класс SyslogAppender, но он обычно определён уже из коробки. Параметром SyslogHost задаём адрес, по которому на порт 514 будут отправляться записи, параметром Facility – вы не поверите! – facility (не знаю, если честно, как в рамках протокола syslog это называется по-русски), а параметром ConversionPattern – шаблон. В данном случае в соответствии с шаблоном в каждую строку, обрабатываемую данным аппендером будет добавляться строка SOME_TEMPLATE, необходимая для распределения строк по лог-файлам на syslog-сервере. Смысл в этом будет только если таких аппендеров несколько (а точнее – более восьми, иначе можно было бы обойтись с помощью facilities local0, local1.. local7).

Описание логгера log4j оставлю за кадром.

Прежде, чем настраивать syslog-ng, убедимся с помощью tcpdump на syslog-сервере, что трафик к нам идёт:

11:52:57.240445 IP 192.168.0.2.52894 > 192.168.0.1: SYSLOG local1.debug, length: 117
11:52:57.240518 IP 192.168.0.2.52894 > 192.168.0.1: SYSLOG local1.debug, length: 108
11:52:57.240546 IP 192.168.0.2.52894 > 192.168.0.1: SYSLOG local1.debug, length: 138

Нормально. Теперь конфигурим syslog-ng:

01.source s_remote {
02.    tcp(ip(0.0.0.0) port(1470));
03.    tcp(ip(0.0.0.0) port(514));
04.    udp(ip(0.0.0.0) port(514));
05.};
06.filter f_test { host(192.168.0.2); };
07.filter f_local1 { facility(local1); };
08.filter f_notlocal1 { not facility(local1); };
09.filter f_templ { message(SOME_TEMPLATE); };
10.destination d_test {
11.    file("/var/log/test.log"  perm(0640) dir_perm(0750) create_dirs(yes));
12.};
13.destination d_other {
14.    file("/var/log/other.log"  perm(0640) dir_perm(0750) create_dirs(yes));
15.};
16.log { source(s_remote); filter(f_local1); filter(f_templ); destination(d_test); };
17.log { source(s_remote); filter(f_notlocal1); destination(d_other); }

Конфиг будет корректен для syslog-ng старше версии 3.0. Для более древних версий вместо директивы message стоит использовать директиву match. Принципиальных отличий больше не будет.

Перезапускаем syslog-ng и проверяем – в данном случае все сообщения с facility local1, удовлетворяющие шаблону SOME_TEMPLATE (то есть все сообщения от описанного выше аппендера log4j) будут писаться в test.log, а все остальные (точнее, с facility отличным от local1) – в файл other.log.

На этом пока что всё.

Tags: , ,
Category: Linux | No comments »

Comments

Leave a comment

 Comment Form 

Rich Text Editor, comment