2016-04-18 17 views
0

Ich lese Dateien als Eingabe und dann übergeben Sie es gefiltert werden, und entsprechend auf der [Typ] folgt die if/else für die Ausgabe (stdout).Logstash-Filter nicht die Regex

hier ist der conf Teil:

filter { 
    if [path] =~ "error" { 
     mutate { 
      replace => { "type" => "ERROR_LOGS"} 
     } 
     grok { 
      match => {"error_examiner" => "%{GREEDYDATA:err}"} 
     } 
     if [err] =~ "9999" { 
      if [err] =~ "invalid offset" { 
       mutate { 
        replace => {"type" => "DISCARDED_ERROR_LOGS"} 
       } 
       grok { 
        match => {"message" => "\[%{DATA:date}\] \[%{WORD:logtype} \] \[%{IPORHOST:ip}\]->\[http://search:9999/%{WORD:searchORsuggest}/%{DATA:askme_tag}\?%{DATA:paramstr}\] \[%{DATA:reason}\]"} 
       } 
       date { 
        match => [ "date", "YYYY-MM-DD aaa HH:mm:ss" ] 
        locale => en 
       } 
       geoip { 
        source => "ip" 
        target => "geo_ip" 
       } 
       kv { 
        source => "paramstr" 
        trimkey => "&\?\[\]," 
        value_split => "=" 
        target => "params" 
       } 
      } 
      else { 
       mutate { 
        replace => {"type" => "ACCEPTED_ERROR_LOGS"} 
       } 
       grok { 
        match => { 
         "message" => "\[%{DATA:date}\] \[%{WORD:logtype} \] \[%{WORD:uptime}\/%{NUMBER:downtime}\] \[%{IPORHOST:ip}\]->\[http://search:9999/%{WORD:searchORsuggest}\/%{DATA:askme_tag}\?%{DATA:paramstr}\]" 
        } 
       } 
       date { 
        match => [ "date" , "YYYY-MM-DD aaa HH:mm:ss" ] 
        locale => en 
       } 
       geoip { 
        source => "ip" 
        target => "geo_ip" 
       } 
       kv { 
        source => "paramstr" 
        trimkey => "&\?\[\]," 
        value_split => "=" 
        target => "params" 
       } 
      } 
     } 
     else if [err] =~ "Exception" { 
      mutate { 
        replace => {"type" => "EXCEPTIONS_IN_ERROR_LOGS"} 
      } 
      grok { 
       match => { "message" => "%{GREEDYDATA}"} 
      } 
     } 
    } 
    else if [path] =~ "info" { 
     mutate { 
      replace => {"type" => "INFO_LOGS"} 
     } 
     grok { 
      match => { 
       "info_examiner" => "%{GREEDYDATA:info}" 
      } 
     } 
     if [info] =~ "9999" { 
      mutate { 
       replace => {"type" => "ACCEPTED_INFO_LOGS"} 
      } 
      grok { 
        match => { 
         "message" => "\[%{DATA:date}\] \[%{WORD:logtype} \] \[%{WORD:uptime}\/%{NUMBER:downtime}\](\[%{WORD:qtype}\])?(\[%{NUMBER:outsearch}/%{NUMBER:insearch}\])? \[%{IPORHOST:ip}\]->\[http://search:9999/%{WORD:searchORsuggest}/%{DATA:askme_tag}\?%{DATA:paramstr}\]" 
        } 
      } 
      date { 
       match => [ "date" , "YYYY-MM-DD aaa HH:mm:ss" ] 
       locale => en 
      } 
      geoip { 
       source => "ip" 
       target => "geo_ip" 
      } 
      kv { 
       source => "paramstr" 
       trimkey => "&\?\[\]," 
       value_split => "=" 
       target => "params" 
      } 
     } 
     else { 
      mutate {replace => {"type" => "DISCARDED_INFO_LOGS"}} 
      grok { 
       match => {"message" => "%{GREEDYDATA}"} 
      } 
     } 
    } 
} 

die grok regexps ich getestet habe http://grokdebug.herokuapp.com/

jedoch zu funktionieren, was nicht funktioniert ist dieser Teil:

grok { 
      match => {"error_examiner" => "%{GREEDYDATA:err}"} 
     } 
     if [err] =~ "9999" { 

Ich habe mich gefragt, Was ist da drin falsch ???

+0

kann ich sonst durch völlig Entfernen der sonst wenn fundae umgehen, dh die Schaffung eigener configs für separate Arten von Protokollen, aber das ist nicht das, was ich will ... die sonst wenn es in muss auch funktionieren! –

Antwort

0

Eigentlich habe ich es behoben. Hier ist, was ich mit anderen Mitmenschen teilen mag, von dem, was hätte ich gelernt, während erste Experimente mit logstash, für die Dokumentation und andere Ressourcen sind nicht so sehr aufschlussreich ...

  1. „error_examiner“ oder „info_examiner "wird nicht funktionieren, analysieren Sie die Instanz/Ereigniszeile in" Nachricht "
  2. geoip funktioniert nicht für interne ips.
  3. kv, für das Sie die field_split und value_split angeben müssen, wenn sie nicht a = 1 b = 2 gefällt werden, aber sagen a: 1 & b: 2 dann field_Split ist &, value_split ist:
  4. stdout, durch Standardvorgabe schlecht, wenn Codec gewählt wird, json, bitte wählen Sie rubydebug.

Danke,