2017-07-17 4 views
1

Ich habe ein Problem mit ELK Stack + Filebeat.Elasticsearch Logstash Filebeat Mapping

Filebeat sendet Apache-ähnliche Protokolle an Logstash, die die Zeilen analysieren sollten. Elasticsearch sollte die geteilten Daten in Feldern speichern, damit ich sie mit Kibana visualisieren kann.

Problem: Elasticsearch erhält die Protokolle aber speichert sie in einem einzigen "Nachricht" -Feld.

gewünschte Lösung:

Input:

10.0.0.1 some.hostname.at - [27/Jun/2017: 23: 59: 59 0200]

ES:

"ip": "10.0.0.1"

"hostname": "some.hostname.at"

"Zeitstempel": "2 7/Jun/2017: 23: 59: 59 0200"

Meine logstash Konfiguration:

input { 

    beats { 
    port => 5044 
    } 



} 

filter { 


    if [type] == "web-apache" { 
     grok { 
      patterns_dir => ["./patterns"] 
      match => { "message" => "IP: %{IPV4:client_ip}, Hostname: %{HOSTNAME:hostname}, - \[timestamp: %{HTTPDATE:timestamp}\]" } 
      break_on_match => false 
      remove_field => [ "message" ] 
     } 

     date { 
      locale => "en" 
      timezone => "Europe/Vienna" 
      match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ] 
     } 

     useragent { 
      source => "agent" 
      prefix => "browser_" 
     } 
    } 

    } 

output { 

    stdout { 
     codec => rubydebug 
    } 

    elasticsearch { 
      hosts => ["localhost:9200"] 
     index => "test1" 
      document_type => "accessAPI" 
      } 
} 

Meine Elasticsearch entdecken Ausgabe:

The "message" field contains my whole log file

Ich hoffe, es gibt keine ELK Experten um das kann mir helfen. Vielen Dank im Voraus, Matthias

Antwort

1

Der von Ihnen angegebene Grok Filter wird hier nicht funktionieren. mit

Versuchen:

%{IPV4:client_ip} %{HOSTNAME:hostname} - \[%{HTTPDATE:timestamp}\] 


Es besteht keine Notwendigkeit gewünschten Namen vor den Feldnamen separat angeben ist (Sie versuchen, die Nachricht nicht hier zu formatieren, aber separate Felder zu extrahieren), um nur Geben Sie den Feldnamen in Klammern an, nachdem das ':' zu dem gewünschten Ergebnis geführt hat.

Verwenden Sie auch die overwrite-Funktion anstelle von remove_field für die Nachricht. Weitere Informationen hier:
https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html#plugins-filters-grok-options

Es wird, dass am Ende aussehen:

filter { 
    grok { 
    match => { "message" => "%{IPV4:client_ip} %{HOSTNAME:hostname} - \[%{HTTPDATE:timestamp}\]" } 
    overwrite => [ "message" ] 
    } 
} 

Sie können grok Filter testen hier:
http://grokconstructor.appspot.com/do/match

Verwandte Themen