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: , ,
Category: Linux | No comments »

Comments

Leave a comment

 Comment Form