rsyslog7 фильтрует имя хоста, если не соответствует регулярному выражению

Поэтому я чрезвычайно новичок в rsyslog (недавно переключился с syslog-ng), и мне очень нравится, что у меня могут быть динамические имена файлов … Моя работа недавно начала использовать докеры, и они отправляют много полей в syslogtag для удаленный узел. Поэтому вместо того, чтобы настраивать фильтры для каждого экземпляра, я пытаюсь написать динамический фильтр, чтобы проанализировать соответствующие данные и поместить его в свой собственный журнал / каталог, такой как / var / log / docker / app name / syslog.log

У меня есть «имя приложения», работающее, когда они предоставляют правильные разделители между полями, но когда они не используют правильный, регулярное выражение возвращает ** NO MATCH ** и помещает все в '/ var / log / docker / ** NO MATCH ** / syslog.log '. Использование каталога ** NO MATCH ** не является проблемой, но группировка каждого удаленного хоста вместе в одном файле. Есть ли способ проверить, не возвратил ли регулярное выражение, а затем изменить имя файла из 'syslog.log' на '% hostname% .log'?

Я не эксперт, но вы можете начать с этого: вам нужно будет повторить ваше регулярное выражение (я не знаю, как вы можете оценить шаблон, чтобы получить строку **NO MATCH** ). Например, скажем, что ваша часть «appname» совпадает с regexp [az]+: тогда вы можете написать

 $template nomatch,"/var/log/docker/nomatch/%hostname%.log" if (not re_match($msg, "[az]+:")) then { action(type="omfile" dynaFile="nomatch") stop } 

$template описывает ваше желаемое имя файла, if пытается найти совпадение, а затем выполняет action записи в файл без дальнейшей обработки этого сообщения. Параметры action() описаны здесь в RainerScript.