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