2016-01-12 3 views
3

J'ai des données provenant de kafka et je veux les envoyer à ElasticSearch. J'ai un journal comme celui-ci avec des tags:Grok - analyse des champs optionnels

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

Je suis en train de l'analyser avec grok en utilisant débogueur grok:

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

Il fonctionne, mais parfois le journal a un nouveau champ comme ce (celui avec l'étiquette <TP>):

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

Je voudrais obtenir des lignes avec ce champ (la balise de TP) et les lignes sans. Comment puis je faire ça?

+0

Utilisez-vous: http://grokdebug.herokuapp.com/ en tant que débogueur? – vdolez

+0

Il semble que vous pouvez utiliser un groupe facultatif: '% {WORD: APPLICATION} \ |% {WORD: PROFIL} \ |% {WORD: ENV} \ |% {WORD: CODE} % {NOMBRE: TN} (?: % {WORD: TP})? S'il vous plaît essayez et laissez-moi savoir si cela fonctionne pour vous. –

+0

Ça marche! Merci beaucoup !! – David

Répondre

7

Si vous avez un champ facultatif, vous pouvez le faire correspondre avec option groupe capture nommé:

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

Le groupe non-capture n'enregistre pas de sous-correspondances en mémoire et est utilisé pour regrouper uniquement, et ? le quantificateur correspond à 1 ou 0 fois (= facultatif). Il créera un champ TP avec une valeur de type mot. Si le champ est absent, la valeur sera null.

Ainsi, tout le modèle ressemblera:

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

S'il vous arrive de revenir à SO, veuillez envisager d'accepter la réponse qui a fonctionné pour vous. –

0

C'est le filtre j'ai utilisé dans Heroku App et la lecture de ce Documentation on how to use grok operators.

J'ai créé mon propre modèle, appelé "contenu", qui récupérera tout ce qu'il contient dans vos tags TP.

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

Fondamentalement, je viens d'ajouter une balise optionnelle à votre modèle.

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

Pour récupérer le contenu, que je suppose peut être quelque chose, j'ajouté ce qui suit à l'intérieur des balises facultatives.

(?<content>(.)*)