在 Rsyslog 中,如何用自定义文本替换正则表达式匹配?

在 Rsyslog 中,如何用自定义文本替换正则表达式匹配?

我正在尝试通过正则表达式捕获文本并用自定义字符串替换文本。

我当前的代码成功捕获了 IP 地址,但我不知道如何将 IP 地址与消息的其余部分一起替换为自定义文本:

$Template privateIP,"%TIMESTAMP% %HOSTNAME% %syslogtag% %msg:R,ERE,0,DFLT:([0-9]{1,3}\.){3}[0-9]{1,3}--end%\n"

我的第一个想法是以某种方式将正则表达式移出模板(即使用一些 RainerScript)并创建一个modded_msg设置为修改msg属性的新字段/变量。然后%modded_msg%在 $Template 中使用。

我尝试过多次(感谢 ChatGPT),但无法让它工作。

答案1

下面的示例可以检查 msg 属性中的 IP 地址,然后根据地址将消息中出现的所有 IP 地址替换为某个字符串。

set $.myip = re_extract($msg, "(([0-9]{1,3}\\.){3}[0-9]{1,3})", 0, 1, 0);
if ($.myip == 0) then  set $.mymsg = $msg;
else{
 if ($.myip=="192.1.2.3") then
  set $.mymsg = replace($msg, $.myip, "SPECIALIP");
 else
  set $.mymsg = replace($msg, $.myip, "boringip");
}
template(name="mytemplate" type="string" string="%TIMESTAMP% %$.mymsg%\n")
action(type="omfile" file="output" template="mytemplate")

re_extract()在属性中查找正则表达式。注意 extra,()这样我们就可以提取捕获组 1,即整个匹配项。此外,\是双倍的。最后一个参数是 0,失败时返回。返回的字符串保存在局部变量中$.myip

replace()替换属性中所有出现的字符串,并在另一个局部变量中返回结果。模板使用这个局部变量。

相关内容