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

时间:2017-03-21 10:18:26

标签: ruby regex fluentd

我有两种不同格式的日志行,您可以使用此site

进行测试

我需要在下面的行中保留可选的客户端部分,如果它存在则结束,否则忽略

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

日志行 - 没有客户

[Mon Jan 18 21:55:58.239970 2016] [proxy_http:error] [pid 2769:tid 140041068427008] AH01114:HTTP:无法连接到后端:xx.xxx.xx.xx

记录行 - 使用客户

[Mon Jan 18 21:55:58.239970 2016] [proxy_http:error] [pid 2769:tid 140041068427008] [client xx.xxx.x.xx:10723] AH01114:HTTP:无法连接到后端:xx .xxx.xx.xx

我试过(。*?clientsection) - &gt; 0场或更多场比赛

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

但它不起作用

1 个答案:

答案 0 :(得分:1)

在你的第二个表达式中, (.*?(\[(?<client>[^\]]*)\]))部分匹配一个强制性空格,然后尽可能少地捕获任何0+字符,然后捕获除]以外的0 +字符到&#34; client& #34;组,然后匹配]将其放在编号的捕获组中。如果文本中缺少客户端部分,则表达式将尝试匹配第一个空格,然后是[...]子字符串,然后是空格。

如果你想修复正则表达式,你需要制作&#34;客户端&#34;分组可选并确保相邻的上下文也是可选的。

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

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