Fluentd 多个正则表达式命名为 Captures

Fluentd Multiple regex named Captures

我们可以连接多个正则表达式命名捕获吗?

我正在尝试在 fluentd conf 文件中使用以下正则表达式来获取 "User" 和 "Serial_Number",但只能获取名字(用户)。

td-agent.conf:

<source>
   type tail
   format /(?<User>(?<=user:).*?(?=\]))(?<Serial_Number>(?<=sn:).*?(?=\]))/
   tag xxxxxx
   path /app/logs/xxxx.log
   pos_file /var/log/td-agent/xxxx_rolling.pos
</source>

日志文件:

Jul24,11:20:17 TID:6 INFO [user:weblogic] [sn:088039] [dur:806ms] {***message}

我是 fluentD 中这种正则表达式格式的新手,非常感谢对此问题的任何帮助。

-普拉文

"Concatenating" 在这种情况下不是必需的,您只需要在第一个捕获组和第二个捕获组之间允许任意数量的任意字符。

你最好使用否定字符 classes,你需要让用户和 sn 之间的任何字符:

/(?<User>(?<=user:)[^]]*)\].*?(?<Serial_Number>(?<=sn:)[^]]*)?\]/
                   ^^^^  ^^^^^                         ^^^^  ^^

demo

[^]]* 否定字符 class 将匹配除 ] 之外的 0 个或多个字符,而 .* 将匹配除换行符之外的 0 个或多个字符。

如果您需要以任意顺序匹配子文本,您也可以使用

/^(?=.*(?:(?<User>(?<=user:)[^]]*)))(?=(?:.*(?<Serial_Number>(?<=sn:)[^]]*))?)/

the second demo