Log4j & syslog-ng: пишем в syslog из java-приложений
Date October 19th, 2010 Author Vitaly Agapov
Никаких нестандартных решений здесь не требуется, однако ж я сумел потратить на эту задачу достаточно ощутимый объём времени. В основном, конечно, проблемы были связаны с тем, что при необходимости писать большое количество разных логов в разные файлы протокол syslog позволяет использовать очень ограниченное количество facilities (для нестандартного использования – всего восемь), отчего пришлось использовать шаблоны.
Финальный результат выглядит примерно так…
В конфиг-файле log4j описываем аппендер:
<appender name="SYSLOG" class="org.apache.log4j.net.SyslogAppender">> <param name="Threshold" value="ALL" /> <param name="SyslogHost" value="192.168.0.1" /> <param name="Facility" value="local1"/> <param name="FacilityPrinting" value="true"/> <layout> <param name="ConversionPattern" value="SOME_TEMPLATE %d %-5p [%c] %m%n" /> </layout> </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:
source s_remote { tcp(ip(0.0.0.0) port(1470)); tcp(ip(0.0.0.0) port(514)); udp(ip(0.0.0.0) port(514)); }; filter f_test { host(192.168.0.2); }; filter f_local1 { facility(local1); }; filter f_notlocal1 { not facility(local1); }; filter f_templ { message(SOME_TEMPLATE); }; destination d_test { file("/var/log/test.log" perm(0640) dir_perm(0750) create_dirs(yes)); }; destination d_other { file("/var/log/other.log" perm(0640) dir_perm(0750) create_dirs(yes)); }; log { source(s_remote); filter(f_local1); filter(f_templ); destination(d_test); }; 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: Java, Linux, Syslog
Category:
Linux |
No comments »