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>[^&]+)" ] }
Pour ceux qui veulent accomplir quelque chose de semblable, j'ai posté mon message dans mon conf. – Edgar