[英]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.