Grok - 解析可选字段

Dav*_*vid 3 regex field grok

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

<TOTO><ID_APPLICATION>APPLI_A|PRF|ENV_1|00</ID_APPLICATION><TN>3</TN></TOTO>
Run Code Online (Sandbox Code Playgroud)

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

\<ID_APPLICATION\>%{WORD:APPLICATION}\|%{WORD:PROFIL}\|%{WORD:ENV}\|%{WORD:CODE}\</ID_APPLICATION\>\<TN\>%{NUMBER:TN}\</TN\>
Run Code Online (Sandbox Code Playgroud)

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

<TOTO><ID_APPLICATION>APPLI_A|PRF|ENV_1|00</ID_APPLICATION><TN>3</TN><TP>new</TP></TOTO>
Run Code Online (Sandbox Code Playgroud)

我想得到这个字段(TP标签)和没有的行.我怎样才能做到这一点?

Wik*_*żew 8

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

(?:<TP>%{WORD:TP}</TP>)?
^^^                    ^
Run Code Online (Sandbox Code Playgroud)

非捕获组不会在内存中保存任何子?匹配,仅用于分组,量词匹配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>)?
Run Code Online (Sandbox Code Playgroud)