繁体   English   中英

Grok - 解析可选字段

[英]Grok - parsing optional fields

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

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

我正在尝试使用 grok 调试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 标签)的行和不带的行。 我怎样才能做到这一点?

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

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

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

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

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

这是我在Heroku 应用程序中使用的过滤器,并阅读了有关如何使用 grok 运算符的文档

我创建了自己的模式,称为“内容”,它将检索您的 TP 标签中的任何内容。

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

基本上,我只是在您的模式中添加了一个可选标签。

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

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

(?<content>(.)*)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM