2017-08-29 2 views
0

Ziel ist: für jede Zeile im Protokoll sollte ein Dokument in elastic sein, das die 'Nachricht' enthält (Text nach Zeitstempel). Jedes Dokument sollte auch Felder für den Projektnamen, den Plannamen und die Buildnummer enthalten. < --Dieser ist, wo ich binWie bestimmte Daten aus Protokoll mit Logstash und Grok und Index als Felder in Kibana für jeden Datensatz ziehen?

Beispiel Log-Struktur am Anfang (atlassian Bambus Build-Protokolle) stecken zu bleiben:

simple 01-Jan-2016 14:26:01 Build TestProj - Framework Code - Build #25 (TST-FC-25) started building on agent .NET Core 2 
simple 01-Jan-2016 14:26:01 .NET-related builds, tests and publishing. 

Ich habe einen Grok zu bekommen, und erstellen Sie die Felder Ich möchte - bauen Name, Build-Nummer und Projektnamen (und haben sie als Felder in Kibana):

%{NOTSPACE:log_entrytype}%{SPACE}(?<timestamp>(?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9])-\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\b-(?>\d\d){1,2}\s*(?!<[0-9])%{HOUR}:%{MINUTE}(?::%{SECOND})(?![0-9]))%{SPACE}Build%{SPACE}%{DATA:BamProjName}%{SPACE}-%{SPACE}%{DATA:BamBuildName}%{SPACE}-%{SPACE}Build%{SPACE}#%{NUMBER:BamBuildNum} 

Allerdings muss ich diese Felder in Kibana in jedem Datensatz/Eintrag vorhanden. Mit dieser anderen Grok kann ich die anderen Zeilen des Protokolls in ein log_message Feld extrahieren:

grok { [ 
      "message", "%{NOTSPACE:log_entrytype}%{SPACE}(?<timestamp>(?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9])-\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\b-(?>\d\d){1,2}\s*(?!<[0-9])%{HOUR}:%{MINUTE}(?::%{SECOND})(?![0-9]))%{SPACE}%{GREEDYDATA:log_message}" 
     ] 
    } 

Also muss ich irgendwie diese beiden Muster in einem passt kombinieren, mit dem ‚optional‘:()? Syntax wie hier beschrieben: link

Ist mein Endziel mit Logstash und dem Grok-Plugin allein erreichbar? Kann ich das mit einer Art von Variablenkonstrukt innerhalb von logstash umgehen? Feld hinzufügen?

*** HINWEIS: mit filebeat Versandprotokolle und elastic does not recommend the multiline codec, also bin ich gespannt, was meine anderen Optionen sind

Antwort

1

Sie müssen sich mit mehrzeiligen Ereignissen arbeiten, haben einen Blick auf die offizielle Dokumentation: https://www.elastic.co/guide/en/logstash/current/multiline.html

+0

Da ich FileBeat für den Versand der Protokolle verwende, empfiehlt Elastic das mehrzeilige Codec-Plugin nicht. Von diesem Link: Wenn Sie ein Logstash-Eingabe-Plug-in verwenden, das mehrere Hosts unterstützt, wie z. B. das Beats-Eingabe-Plugin-Eingabe-Plug-in, sollten Sie den Multiline-Codec-Plugin-Codec nicht für mehrzeilige Ereignisse verwenden. Dies kann dazu führen, dass Streams und beschädigte Ereignisdaten gemischt werden. In diesem Fall müssen Sie mehrzeilige Ereignisse behandeln, bevor Sie die Ereignisdaten an Logstash senden. – JohnZaj

+0

Ok, versuch es mal hier anzuschauen: https://www.elastic.co/guide/en/beats/filebeat/5.3/multiline-examples.html (keine Erfahrung zu teilen) – whites11

+0

werde ich tun. Aber w/Filebeat ist nicht einmal klar, wenn Sie mehr als eine multiline. * in der Yml ausgedrückt haben, wie ich bereits eine für die Konsolidierung von mehrstufigen Stack-Traces in einer Nachricht benötigt. +1 für wer mich auf diese Dokumentation verweist – JohnZaj

Verwandte Themen