Grok - 解析可选字段

6

我从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标记)和不包含此字段的行。我该怎么做?

你是否在使用以下网址作为调试器: http://grokdebug.herokuapp.com/? - vdolez
看起来你可以使用一个可选组:<ID_APPLICATION>%{WORD:APPLICATION}\|%{WORD:PROFIL}\|%{WORD:ENV}\|%{WORD:CODE}</ID_APPLICATION><TN>%{NUMBER:TN}</TN>(?:<TP>%{WORD:TP}</TP>)?。请尝试并告诉我是否有效。 - Wiktor Stribiżew
它运行正常!非常感谢!! - David
请考虑接受我的下面的答案 - Wiktor Stribiżew
2个回答

11

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

(?:<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>)?

0
这是我在Heroku应用程序中使用的过滤器,阅读此有关如何使用Grok运算符的文档
我创建了自己的模式,称为“content”,它将检索TP标记内部的任何内容。
\<ID_APPLICATION\>%{WORD:APPLICATION}\|%{WORD:PROFIL}\|%{WORD:ENV}\|%{WORD:CODE}\<\/ID_APPLICATION\>\<TN>%{NUMBER:TN}\<\/TN\>(\<TP\>(?<content>(.)*)\<\/TP\>)?

基本上,我只是在您的模式中添加了一个可选标签。
(<TP> ... </TP>)? 

为了获取内容,我假设内容可以是任何东西,因此在可选标签中添加了以下内容。

(?<content>(.)*)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接