Перейти к содержимому
Калькуляторы

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

 

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

 

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.