0

Ich verwende ELK, um alle unsere Protokolle zu zentralisieren, und ich weiterleiten Artifactory Anforderungsprotokolle. 20160615130655|1|REQUEST|123.456.789.012|non_authenticated_user|GET|/9spj7rhd.fts|HTTP/1.1|401|0Elasticsearch logstash Datum nicht korrekt zuordnen

Dies ist der Logstash Filter:

Dies wäre eine Probenleitung sein

filter{ 
     if [type] == 'artifactory-request'{ 
       grok { 
         'match'   => {"message" => "%{DATESTAMP_EVENTLOG:logtime:string}\|%{NUMBER:request_time}\|%{DATA:request_type}\|%{IP:request_ip}\|%{DATA:request_username}\|%{DATA:request_method}\|%{DATA:resource_path}\|HTTP/%{NUMBER:http_version}\|%{NUMBER:response_code}\|%{NUMBER:size}"} 
         'remove_tag' => ["_grokparsefailure"] 
       } 

       date { 
         'match' => ["logtime", "yyyyMMddHHmmss"] 
       } 

     } 
} 

was in Ordnung zu sein scheint zu funktionieren, ich sehe Abbildung es die Werte, wenn ich in den Protokollen Logstash aussehen richtig:

Jun 15 13:10:30 elk docker[22890]: "@version" => "1", 
Jun 15 13:10:30 elk docker[22890]: "@timestamp" => "2016-06-15T13:10:24.000Z", 
Jun 15 13:10:30 elk docker[22890]: "file" => "/mnt/artifactory/logs/request.log", 
Jun 15 13:10:30 elk docker[22890]: "host" => "artifactory", 
Jun 15 13:10:30 elk docker[22890]: "offset" => "4667597", 
Jun 15 13:10:30 elk docker[22890]: "type" => "artifactory-request", 
Jun 15 13:10:30 elk docker[22890]: "tags" => [], 
Jun 15 13:10:30 elk docker[22890]: "logtime" => "20160615131024", 
Jun 15 13:10:30 elk docker[22890]: "request_time" => "1", 
Jun 15 13:10:30 elk docker[22890]: "request_type" => "REQUEST", 
Jun 15 13:10:30 elk docker[22890]: "request_ip" => "123.456.789.012", 
Jun 15 13:10:30 elk docker[22890]: "request_username" => "non_authenticated_user", 
Jun 15 13:10:30 elk docker[22890]: "request_method" => "GET", 
Jun 15 13:10:30 elk docker[22890]: "resource_path" => "/login.php", 
Jun 15 13:10:30 elk docker[22890]: "http_version" => "1.1", 
Jun 15 13:10:30 elk docker[22890]: "response_code" => "401", 
Jun 15 13:10:30 elk docker[22890]: "size" => "0" 
Jun 15 13:10:30 elk docker[22890]: } 

jedoch ES scheint nicht mein logtime Feld zu mögen.

Jun 15 13:18:00 elk docker[22580]: [2016-06-15 13:18:00,288][DEBUG][action.bulk    ] [Stellaris] [logstash-2016.06.15][4] failed to execute bulk item (index) index {[logstash-2016.06.15][artifactory-request][AVVUNhxaSE2i6S9oVvq2], source[{"message":"20160615131757|0|REQUEST|123.456.789.012|non_authenticated_user|GET|/|HTTP/1.1|302|0","@version":"1","@timestamp":"2016-06-15T13:17:57.000Z","file":"/mnt/artifactory/logs/request.log","host":"artifactory","offset":"4668979","type":"artifactory-request","tags":[],"logtime":"20160615131757","request_time":"0","request_type":"REQUEST","request_ip":"123.456.789.012","request_username":"non_authenticated_user","request_method":"GET","resource_path":"/","http_version":"1.1","response_code":"302","size":"0"}]} 
Jun 15 13:18:00 elk docker[22580]: MapperParsingException[failed to parse [logtime]]; nested: IllegalArgumentException[Invalid format: "20160615131757" is malformed at "31757"]; 

an den Abbildungen der Suche (die ich bin Erraten automatisch erzeugt worden sind, wie ich es nicht getan) Ich kann sehen, warum es nicht gefällt

"logtime" : { 
    "type" : "date", 
    "format" : "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis" 
} 

Wie ES entscheidet Logtime ist ein Datum? Wie kann ich es beheben, damit es dieses neue Format akzeptiert, das ich eingabe? Das hat früher geklappt und ich habe nichts wirklich verändert, deshalb bin ich ziemlich verwirrt.

Dies ist die einzige ouput bezogene Konfiguration, die ich auf der Logstash Seite haben:

output { 
    elasticsearch { hosts => ["elasticsearch:9200"] } 
    stdout { codec => rubydebug } 
} 

Und ich habe keine Konfiguration auf Elasticsearch geändert, ich verwende, was standardmäßig kommt.

Irgendwelche Ideen bitte? Was vermisse ich?

Vielen Dank.

Antwort

0

Wie Sie gesagt haben, das Problem kommt von der Zuordnung.

Sie können das Logtime-Feld von einer Zeichenfolge in ein Datum umwandeln. Mit einem zweiten Datumsfilter, mit einem Ziel auf das LOGTIME Feld:

date { 
      'match' => ["logtime", "yyyyMMddHHmmss"] 
      'target' => "logtime" 
    } 

Dies wird die Saite mit einem Datum und dem Mapping Problem auftauchen wird nicht ersetzen.
Der Datumsfilter mit 'target' => "logtime" muss nach dem einen ohne platziert werden, oder es wird nicht funktionieren.

Es ist eine Lösung, aber Sie sollten versuchen zu untersuchen, warum Sie eine solche Zuordnung haben. Die ES-Zuordnungen werden einem Index zugeordnet und beim Empfangen eines Dokuments erstellt. Sie hängen von den Feldern dieses Dokuments ab.
So bedeutet es das erste artifactory-request Dokument in ES angekommen hatte ein Datum im Feld logtime. Oder es gibt eine Vorlage in ES, die verwendet wird, um den Index zu erstellen, der Protokollzeit dem Datumstyp zuordnet.

+0

Danke @baudsp. Es hat jetzt aufgehört, sich über das vorherige Format zu beschweren und begann sich über das Datumsformat eines anderen Protokolls zu beschweren. Als (hoffentlich) schnelle Lösung habe ich die Namen so geändert, dass 'logtime' nun' artefactory_logtime' ist und so weiter. Mal sehen, ob das mein Problem löst, während ich weiter nachforsche. Danke für Ihre Hilfe! – davidfm