td-agent 中的可选正则表达式模式

optional regex patten in td-agent

我有两种不同格式的日志行,你可以用这个做测试site

我需要在下面的行中保留可选的 client 部分,如果它存在它就会得出结论,否则它会忽略

\[(?<date>[^\]]*)\] \[(?<level>[^\]]*)\] \[(?<pid-tid>[^\]]*)\] (\[(?<client>[^\]]*)\]) (?<message>[^\]]*)

日志行 - 没有客户端

[1 月 18 日星期一 21:55:58.239970 2016] [proxy_http:错误] [pid 2769:tid 140041068427008] AH01114:HTTP:无法连接到后端:xx.xxx.xx.xx

日志行 - 与客户端

[1 月 18 日星期一 21:55:58.239970 2016] [proxy_http:错误] [pid 2769:tid 140041068427008] [客户端 xx.xxx.x.xx:10723] AH01114: HTTP:无法连接到后端:xx.xxx.xx.xx

我试过 (.*?clientsection) -> 0 个或更多匹配项

\[(?<date>[^\]]*)\] \[(?<level>[^\]]*)\] \[(?<pid-tid>[^\]]*)\] (.*?(\[(?<client>[^\]]*)\])) (?<message>[^\]]*)

但是没用

在你的第二个表达式中, (.*?(\[(?<client>[^\]]*)\])) 部分匹配一个必需的 space,然后捕获任何 0+ 个字符,尽可能少,然后捕获除 ] 以外的 0+ 个字符进入 "client" 组,然后匹配 ] 将其放入编号的捕获组中。如果文本中缺少客户端部分,您的表达式将尝试匹配第一个 space,然后是 [...] 子字符串,最后是 space。

如果您想修复正则表达式,您需要使 "client" 组成为可选的 并确保相邻的上下文也成为可选的。

(.*?(\[(?<client>[^\]]*)\])) 替换为 (?: \[(?<client>[^\]]*)\])?。这里,(?:...)? 是一个可选的非捕获组,它将不创建子组(不捕获),并且将匹配其模式的 1 次或 0 次出现,前提是所有序列都存在。

参见Rubular demo\n被添加到否定字符类,因为多行字符串用于测试)。