Logstash - Ajout de patterns


(Flo Car) #1

Bonjour à tous,

Je suis nouveau sur logstash et je travaille actuellement sur une extraction de données depuis un fichier log (Apache) en vu d'être utilisées dans ES.

Voici le type de données log que je traite : ("access_log")

94.219.44.54 - - [09/Dec/2015:00:00:13 +0100] "GET /r17.gif?rnd=0-1-13088-1-13088-27275-4262501361-xrqkaMOXebiyfcifcaeqOgyO8BFc8a8W_SgDSWu4_mgDSWvaW@wW5ajkdWGdeduyIrKGacJZG4cGbfaawGOiabaagaaGacGayafQe2j1DhrVBJiUyw1ZlMH2lNbYB2qa HTTP/1.1" 200 43 "https://www.website.com/search/?text=hager+antennen++sockelleiste&filter=&aliasname=" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0" PID=2708 T=546 XF=[94.219.44.54] H=10.240.1.252

Mon fichier .conf est le suivant : (apache.conf)

input {
     file {
         path => "C:/Users/me/Desktop/P5 - Apache/Log/access_log"
         start_position => "beginning"
     }
}
filter {
	grok {
              patterns_dir => "./patterns
              match => { "message" => "%{COMBINEDAPACHELOG}"}
        }
        date { match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]}
}
output {
      elasticsearch { hosts => ["10.155.51.12:9201"]}
      stdout { codec => rubydebug }
}

Mon patterns est le suivant : (patterns)

PID PID=(\d*)
SERVERIP H=(\d.*)
DURATION T=(\d*)

COMMONAPACHELOG %{IPORHOST:clientip} %{HTTPDUSER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{PID:pid} 

COMBINEDAPACHELOG %{COMMONAPACHELOG} %{QS:referrer} %{QS:agent}

Mon résultat est le suivant :

{
       "message" => "94.219.44.54 - - [09/Dec/2015:00:00:13 +0100] \"GET /r17.gi
f?rnd=1-1-13088-1-13088-27275-4262501361-xrqkaMOXebiyfcifcaeqOgyO8BFc8a8W_SgDSWu
4_mgDSWvaW@wW5ajkdWGdeduyIrKGacJZG4cGbfaawGOiabaagaaGacGayafQe2j1DhrVBJiUyw1ZlMH
2lNbYB2qa HTTP/1.1\" 200 43 \"https://www.website.com/search/?text=hager+a
ntennen++sockelleiste&filter=&aliasname=\" \"Mozilla/5.0 (Windows NT 6.1; WOW64;
 rv:35.0) Gecko/20100101 Firefox/35.0\" PID=2708 T=490 XF=[94.219.44.54] H=10.24
0.1.252",
      "@version" => "1",
    "@timestamp" => "2015-12-17T10:41:55.018Z",
          "host" => "HQLP7575SN1396",
          "path" => "C:/Users/me/Desktop/P5 - Apache/Log/access_log"
,
          "tags" => [
        [0] "_grokparsefailure"
    ]
}

Mon problème est le suivant :

Je tente d'extraire des données supplémentaires (PID, H(serverip) et T(duration)) mais je n'arrive pas à intégrer des requètes Regex ou lier mon .conf à mon patterns. Je n'ai pour l'instant pas réussi à trouver une réponse viable dans la doc.
Auriez-vous éventuellement une piste?

Merci par avance,
Florian.


(David Pilato) #2

Comme ça, je n'ai pas de piste. Et j'avoue être très moyen (et encore je suis généreux) en regex!

Mais j'essaierais de simplifier au maximum sans partir d'un ligne complète mais juste du bout qui ne passe pas.

Eventuellement en m'aidant de http://grokconstructor.appspot.com/


(Flo Car) #3

Merci pour ton aide! Je vais explorer cette piste et je posterai mon résultat.


(Flo Car) #4

La solution était de modifier le pattern de la manière suivante ;

COMMONAPACHELOG %{IPORHOST:clientip} %{HTTPDUSER:ident} %{USER:auth} [%{HTTPDATE:timestamp}] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:response} (?:%{NUMBER:bytes}|-)

COMBINEDAPACHELOG %{COMMONAPACHELOG} %{QS:referrer} %{QS:agent} PID=%{NUMBER:pid:int} T=%{NUMBER:duration:int} XF=([[\d.]*]) H=%{IP:serverip}

Détailler l'intégralité de la ligne en intégrant uniquement les nouvelles variables désirées sous la syntaxe décrite ci-dessus.
En cas d'éléments non désirés, simplement remplacer par le code Regex entre parenthèses.

Merci pour ton assistance @dadoonet, j'espère que cette réponse aidera d'autres nécessiteux.

Edit : Ne pas oublier de préciser le TYPE de la variable que nous voulons obtenir en sortie : par défaut, même si vous tenter d'extraire un NUMBER, le type de la réponse sera un String.


(system) #5