2017-08-29 5 views
0

Le but est: pour chaque ligne dans le journal, il devrait y avoir un document en élastique contenant le 'message' (texte après horodatage). Chaque document doit également contenir des champs pour le nom du projet, le nom du plan et le numéro de version. < --C'est où je suis en train coincéComment extraire des données spécifiques du journal en utilisant logstash et Grok et indexer comme champs dans Kibana pour chaque enregistrement?

exemple, la structure du journal au début (les journaux de construction Atlassian en bambou):

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. 

J'ai un Grok pour obtenir et créer les champs que je veux - construire le nom, le numéro de build et le nom du projet (et les avoir comme champs 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} 

Cependant, je besoin de ces champs disponibles dans chaque enregistrement/entrée dans Kibana. Avec cet autre Grok, je peux extraire les autres lignes du journal dans un champ log_message:

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}" 
     ] 
    } 

Alors dois-je combiner en quelque sorte ces deux matches de modèle en un seul, en utilisant le « option »:()? Syntaxe comme décrit ici ?: link

Mon objectif final est-il réalisable avec logstash et le plugin Grok seul? Puis-je gérer cela avec un type de construction de variable dans logstash? ajouter le champ?

*** REMARQUE: en utilisant filebeat pour les journaux d'expédition et elastic does not recommend the multiline codec, donc je suis curieux de savoir ce que mes autres options sont

Répondre

1

Vous devez travailler avec des événements multilignes, consultez la documentation officielle: https://www.elastic.co/guide/en/logstash/current/multiline.html

+0

puisque j'utilise filebeat pour l'envoi des logs, élastique ne recommande pas le plugin codec multiligne. à partir de ce lien: Si vous utilisez un plugin d'entrée Logstash prenant en charge plusieurs hôtes, tel que le plugin d'entrée du plugin d'entrée Beats, vous ne devez pas utiliser le codec plugin Multiline codec pour gérer les événements multilignes. Cela pourrait entraîner le mélange de flux et des données d'événement corrompues. Dans ce cas, vous devez gérer les événements multilignes avant d'envoyer les données d'événement à Logstash. – JohnZaj

+0

Ok, essayez d'avoir un coup d'oeil ici: https://www.elastic.co/guide/en/beats/filebeat/5.3/multiline-examples.html (aucune expérience à partager dans ce) – whites11

+0

fera l'affaire. cependant w/Filebeat n'est même pas clair si vous pouvez avoir plus d'un multiline. * exprimé dans le yml, car j'en ai déjà besoin d'un pour consolider des traces de pile multilignes en un seul message. +1 pour celui qui me pointe vers cette documentation – JohnZaj