Rsyslog: как разделить входящие логи с IP-адресами
Я пытаюсь настроить Rsyslog со следующей конфигурацией: я слушаю порт 514 для получения данных с разных хостов: 172.16.111.222, 172.16.111.111 и 172.16.222.111. И я хочу хранить эти журналы в разных папках для каждого хоста. Итак, я сделал это конф:
$ModLoad imudp
$Ruleset RemoteConnections
$RulesetCreateMainQueue on
$ActionQueueType LinkedList
$ActionQueueFileName dbremotecons
$ActionResumeRetryCount -1
*.* ~
$InputUDPServerBindRuleset RemoteConnections
$UDPServerRun 514
if $fromhost-ip=='172.16.111.222' then /var/log/prod1/%FROMHOST-IP%/%syslogfacility-text%.log
& ~
if $fromhost-ip=='172.16.111.111' then /var/log/prod1/%FROMHOST-IP%/%syslogfacility-text%.log
& ~
if $fromhost-ip=='172.16.222.111' then /var/log/product2/%FROMHOST-IP%/%syslogfacility-text%.log
& ~
К сожалению, это не работает, rsyslog ничего не регистрирует. Я не уверен, что означает "& ~", я нашел это в интернете.
Какие-нибудь идеи, чтобы заставить это работать?
2 ответа
Вы не можете использовать заполнители непосредственно в правилах. Используйте шаблоны вместо. Следующее должно работать:
$template DynaFile,"/var/log/%FROMHOST-IP%/%syslogfacility-text%.log"
*.* -?DynaFile
Или, чтобы быть ближе к вашему коду:
$template prod1,"/var/log/prod1/%FROMHOST-IP%/%syslogfacility-text%.log"
$template prod2,"/var/log/prod2/%FROMHOST-IP%/%syslogfacility-text%.log"
if $fromhost-ip=='172.16.111.111' then ?prod1
if $fromhost-ip=='172.16.111.222' then ?prod1
if $fromhost-ip=='172.16.222.111' then ?prod2
"~" означает сброс или остановку, что является " действием" rsyslog.
Так:
if $fromhost-ip=='172.16.111.222' then /var/log/prod1/%FROMHOST-IP%/%syslogfacility-text%.log
& ~
означает, что если оператор "if ... then ..." работает, то есть выполняется условие, и сообщение заносится в файл, то остановка - дальнейшие действия не выполняются.