2016-10-10 1 views
1

je suivant le filtre qui réalise la plupart de mes besoins:(Logstash, Grok) si le champ contient un mot spécifique, puis enregistrez quelques personnages de ce

filtre {
grok { 
    match => { "message" => [ "%{IPORHOST:clientip} - %{NGUSER:user} \[%{HTTPDATE:timestamp}\] (?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest}) %{NUMBER:response} (?:%{NUMBER:bytes}|-) (-|(%{DATA:referrer})) ] } 

Cependant, certains (pas tous) Les journaux que j'analyse contiennent le nom du canal qu'un utilisateur utilise sur mon serveur Apache.

Un journal normal, y compris le mot "canal" serait comme ceci:


10.40.80.11 - [email protected] [03/Jan/2014: 13: 08: 21 +0000] " GET/cgi-bin/feed/epg? channel = Bloomberg% 20English & date = 03/01/2016 HTTP/1.1" 200 368 "http://example.net/cgi-bin/feed/epg" "Mozilla/5.0"


Le champ "rawrequest" est enregistré dans un champ séparé comme celui-ci:

"? GET/cgi-bin/alimentation/canal = Bloomberg opg% 20English & date = 04/04/2016 HTTP/1.1"

Question: Comment puis-je enregistrer les noms des canaux sur un champ distinct tenant compte tous les journaux ne contiennent pas le mot canal dans le champ "rawrequest" ?.

J'ai vu beaucoup d'exemples mais rien de semblable. Le caractère séparant le canal au reste de la chaîne est "&". J'apprécierais toute aide.

Solution:

match => { "request" => [ "channel=(?<Channels>[^&]+)" ] } 
+0

Pour ceux qui veulent accomplir quelque chose de semblable, j'ai posté mon message dans mon conf. – Edgar

Répondre

0

Vous grok existant est la création de champs. Vous pouvez créer plus de champs de ces champs en utilisant un autre grok. Une expression rationnelle comme

channel=(?<myField>[^&]+) 

devrait fonctionner, de sorte que votre grok pourrait ressembler à ceci (non testé):

grok { 
    match => { "request" => [ "channel=(?<myField>[^&]+)" ] } 
} 

Cela vous faire un nouveau champ appelé 'myField'. Renommez comme désiré.

Une autre option consisterait à modifier votre motif grok d'origine, en utilisant des motifs prédéfinis plus spécifiques plutôt que NOTSPACE. Découvrez le modèle URI. Malheureusement, ce modèle ne crée pas de champs pour vous, vous devrez donc le modifier. Si vous placez l'information URIPATHPARAM dans un autre champ, vous pouvez alors utiliser le filtre kv {} et analyser toutes les paires dans leurs propres champs.

Beaucoup d'options ...

+0

Merci pour votre réponse. Je suis un peu nouveau à Logstash. Pourriez-vous être plus précis sur où exactement devrais-je placer cette ligne? – Edgar