Grok - 解析可选字段

时间:2016-01-12 15:14:02

标签: regex field grok

我有来自kafka的数据,我想将它们发送给ElasticSearch。我有这样的日志标签:

<TOTO><ID_APPLICATION>APPLI_A|PRF|ENV_1|00</ID_APPLICATION><TN>3</TN></TOTO>

我尝试使用grok调试器使用grok解析它:

\<ID_APPLICATION\>%{WORD:APPLICATION}\|%{WORD:PROFIL}\|%{WORD:ENV}\|%{WORD:CODE}\</ID_APPLICATION\>\<TN\>%{NUMBER:TN}\</TN\>

它有效,但有时日志会有一个像这样的新字段(标记为<TP>的字段):

<TOTO><ID_APPLICATION>APPLI_A|PRF|ENV_1|00</ID_APPLICATION><TN>3</TN><TP>new</TP></TOTO>

我希望获得这个字段(TP标签)的行和没有的行。我怎么能这样做?

2 个答案:

答案 0 :(得分:8)

如果您有可选字段,则可以将其与可选的命名捕获组匹配:

(?:<TP>%{WORD:TP}</TP>)?
^^^                    ^

非捕获组不会在内存中保存任何子匹配,仅用于分组,?量词匹配1或0次(=可选)。它将创建一个TP字段,其值为word。如果该字段不存在,则值为null

因此,整个模式将如下所示:

<ID_APPLICATION>%{WORD:APPLICATION}\|%{WORD:PROFIL}\|%{WORD:ENV}\|%{WORD:CODE}</ID_APPLICATION><TN>%{NUMBER:TN}</TN>(?:<TP>%{WORD:TP}</TP>)?

答案 1 :(得分:0)

这是我在Heroku App中使用的过滤器并阅读此Documentation on how to use grok operators

我创建了自己的模式,名为&#34; content&#34;这将检索TP标签内的任何内容。

\<ID_APPLICATION\>%{WORD:APPLICATION}\|%{WORD:PROFIL}\|%{WORD:ENV}\|%{WORD:CODE}\<\/ID_APPLICATION\>\<TN>%{NUMBER:TN}\<\/TN\>(\<TP\>(?<content>(.)*)\<\/TP\>)?

基本上,我刚为您的模式添加了一个optionnal标记。

(<TP> ... </TP>)? 

要检索我认为可以是任何内容的内容,我在可选标记内添加了以下内容。

(?<content>(.)*)