我有来自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标签)的行和没有的行。我怎么能这样做?
答案 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>(.)*)