Jump to content
Калькуляторы

Вопрос по конфигурации syslog-ng

Хочу поднять централизованный 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 этот будет локальный (их среды), а не удаленный.

Share this post


Link to post
Share on other sites

Вообщем шаблоны и макросы — это вещи разные.

Как использовать шаблоны я пока не понял.

С макросами у меня пока вышло так:

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 на каждый случай?

Share this post


Link to post
Share on other sites

Сочинил такую конфигурацию:

 

 

@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
# дефолтная конфигурация для локальных логов

 

 

 

Посоветуйте, что следует улучщить/исправить?

Share this post


Link to post
Share on other sites

3. Ну и наконец я также хочу собирать логи с коммутаторов доступа, которые надо складывать в /syslog/acc, с именем <SWITCH>.log, где <SWITCH> это IP-адрес устройства.

С syslog-ng не помогу, но можете побаловаться с решением "из коробки". Там, правда, под винду, но зато собирает и сислог и мак-нотифи и пишет в базу, а не в файлы. Под никсы тоже есть, работает параллельно с штатным сислогом (на коммутаторе надо менять порт, на который будут отправляться сообщения), но его надо слегка подшаманить, отвязать от нашей инфраструктуры.

Share this post


Link to post
Share on other sites

У меня с коммутаторами зоопарк. Причем D-Link я больше не применяю, их осталось десятка четыре.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this