alibek Posted October 28, 2014 · Report post Хочу поднять централизованный syslog-сервер. Хостов много, на обычном syslog я пробовал это делать — работало, но конфигурировать было неудобно, нужно было прописывать каждый хост в конфигурации. Почитал про альтернативы, вроде бы syslog-ng должен мне помочь. Но с документацией у него все как-то очень запутанно. 1. У меня есть несколько серверов. С них логи нужно складывать в /syslog/srv, имя файла должно быть <SERVER>_<TYPE>.log, где <SERVER> это имя сервера, а <TYPE> это тип логов (у файрвола pf, у dns dns, у ошибок авторизации auth и все остальное в common). 2. У меня также есть несколько сетевых устройств в ядре сети. С них логи нужно складывать в /syslog/net, имя файла должно быть <HOST>_<TYPE>.log, где <HOST> это имя или IP устройства, а <TYPE> это тип логов (типы urgent, common и debug). 3. Ну и наконец я также хочу собирать логи с коммутаторов доступа, которые надо складывать в /syslog/acc, с именем <SWITCH>.log, где <SWITCH> это IP-адрес устройства. На сайте документация достаточно своеобразная. Однако нашел такой раздел: 5.8.2.1. Passing arguments to configuration blocks. Если я правильно понял, мне нужно сделать так: @define base "/syslog" block destination logserver(host() scope()) { file("`base`/srv/`host`_`scope`.log"); }; block destination lognetwork(host() scope()) { file("`base`/net/`host`_`scope`.log"); }; block destination logaccess(host() scope()) { file("`base`/acc/`host`.log"); }; Но в документации нет примеров того, как эти блоки-макросы можно использовать. Вроде бы как-то так должно быть: log { source(src_server1); filter(filter1); destination(logserver("server1","common")); }; Но выглядит довольно нелепо — мне каждый сервер нужно будет определять дважды, в source и в log. То есть это ничем не лучше, чем в syslog. Вместе с тем я встречал в интернете такие записи: destination df_remote { file("/var/log/remote/$HOST-firewall.log"); }; Тут из синтаксиса все вроде бы очевидно. Но меня смущает мануал: 5.6. Global and environmental variables The environmental variables of the host are automatically imported and can be used as global variables. То есть я документацию понял так, что переменные среды автоматически импортируются в глобальные переменные. То есть должно быть не $HOST, а `HOST`. Ну и HOST этот будет локальный (их среды), а не удаленный. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alibek Posted October 28, 2014 · Report post Вообщем шаблоны и макросы — это вещи разные. Как использовать шаблоны я пока не понял. С макросами у меня пока вышло так: destination logserver { file("`base`/server/${HOST}.${BSDTAG}.log" template("${ISODATE} ${MSGHDR}${MSG}\n") template-escape(no) ); }; source remote { udp(); }; filter f_server { netmask("10.1.128.0/24"); }; log { source(remote); filter(f_server); destination(logserver); }; Но хотелось бы группировать логи не по BSDTAG, а по той схеме, которую я вначале описал. Не посоветуете, как это сделать? Делать несколько filter на каждый случай? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alibek Posted October 28, 2014 · Report post Сочинил такую конфигурацию: @version:3.6 @include "scl.conf" @define base "/syslog" options { chain_hostnames(off); flush_lines(0); threaded(yes); create_dirs(yes); }; template logfmt { template("${ISODATE} <${BSDTAG}> ${MSGHDR}${MSG}\n"); template-escape(no); }; destination srv_all { file("`base`/server/${HOST}.${YEAR}-${MONTH}.log" template(logfmt)); }; destination srv_common { file("`base`/server/${HOST}.${YEAR}-${MONTH}.common.log" template(logfmt)); }; destination srv_alert { file("`base`/server/${HOST}.${YEAR}-${MONTH}.alert.log" template(logfmt)); }; destination srv_urgent { file("`base`/server/${HOST}.${YEAR}-${MONTH}.urgent.log" template(logfmt)); }; destination srv_console { file("`base`/server/${HOST}.${YEAR}-${MONTH}.console.log" template(logfmt)); }; destination srv_debug { file("`base`/server/${HOST}.${YEAR}-${MONTH}.debug.log" template(logfmt)); }; destination net_all { file("`base`/network/${HOST}.${YEAR}-${MONTH}.log" template(logfmt)); }; destination net_common { file("`base`/network/${HOST}.${YEAR}-${MONTH}.common.log" template(logfmt)); }; destination net_alert { file("`base`/network/${HOST}.${YEAR}-${MONTH}.alert.log" template(logfmt)); }; destination net_config { file("`base`/network/${HOST}.${YEAR}-${MONTH}.config.log" template(logfmt)); }; destination net_states { file("`base`/network/${HOST}.${YEAR}-${MONTH}.states.log" template(logfmt)); }; destination net_debug { file("`base`/network/${HOST}.${YEAR}-${MONTH}.debug.log" template(logfmt)); }; destination acc_event { file("`base`/access/${HOST}.${YEAR}-${MONTH}.event.log" template(logfmt)); }; destination acc_debug { file("`base`/access/${HOST}.${YEAR}-${MONTH}.debug.log" template(logfmt)); }; destination dst_other { file("`base`/${HOST}.${YEAR}-${MONTH}.log" template(logfmt)); }; destination syslog { udp("srv-svc01" port(514)); udp("srv-svc02" port(514)); }; source local { system(); internal(); }; source remote { udp(); }; filter f_server { netmask("10.1.128.0/24"); }; filter f_server_con { filter(f_server) and facility(console); }; # далее будут фильтры по facility и level filter f_network { netmask("10.1.255.0/24"); }; # далее будут фильтры по facility и level filter f_access { netmask("10.1.0.0/16") and not filter(f_server) and not filter(f_network); }; filter f_access_evt { filter(f_access) and level(warning..emerg); }; filter f_access_dbg { filter(f_access) and level(debug..emerg); }; filter f_other { netmask("0.0.0.0/0") and not filter(f_access) and not filter(f_server) and not filter(f_network); }; # Remote logging log { source(remote); filter(f_server); destination(srv_all); }; log { source(remote); filter(f_server_con); destination(srv_console); }; log { source(remote); filter(f_network); destination(net_all); }; log { source(remote); filter(f_access_evt); destination(acc_event); }; log { source(remote); filter(f_access_dbg); destination(acc_event); }; log { source(remote); filter(f_other); destination(dst_other); }; # форвард для обработки в штатном порядке log { source(local); destination(syslog); }; # Local logging # дефолтная конфигурация для локальных логов Посоветуйте, что следует улучщить/исправить? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
xcme Posted October 29, 2014 · Report post 3. Ну и наконец я также хочу собирать логи с коммутаторов доступа, которые надо складывать в /syslog/acc, с именем <SWITCH>.log, где <SWITCH> это IP-адрес устройства. С syslog-ng не помогу, но можете побаловаться с решением "из коробки". Там, правда, под винду, но зато собирает и сислог и мак-нотифи и пишет в базу, а не в файлы. Под никсы тоже есть, работает параллельно с штатным сислогом (на коммутаторе надо менять порт, на который будут отправляться сообщения), но его надо слегка подшаманить, отвязать от нашей инфраструктуры. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alibek Posted October 29, 2014 · Report post У меня с коммутаторами зоопарк. Причем D-Link я больше не применяю, их осталось десятка четыре. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...