Strukturering af ustrukturerede data med GROK
Hvis du bruger Elastic (ELK)-stakken og er interesseret i at kortlægge brugerdefinerede Logstash-logfiler til Elasticsearch, så er dette indlæg noget for dig.
ELK-stakken er et akronym for tre open source-projekter: Elasticsearch, Logstash og Kibana. Sammen danner de en logstyringsplatform.
- Elasticsearch er et søge- og analysesystem.
- Logstash er en databehandlingspipeline på serversiden, der indtager data fra flere kilder samtidigt, transformerer dem og derefter sender dem til en "stash" såsom Elasticsearch.
- Kibana giver brugerne mulighed for at visualisere data ved hjælp af diagrammer og grafer i Elasticsearch.
Beats kom senere og er en let dataafsender. Introduktionen af Beats forvandlede Elk Stack til Elastic Stack, men det er ikke meningen.
Denne artikel handler om Grok, som er en funktion i Logstash, der kan transformere dine logfiler, før de sendes til gemmerne. Til vores formål vil jeg kun tale om behandling af data fra Logstash til Elasticsearch.
Grok er et filter inde i Logstash, der bruges til at parse ustrukturerede data til noget struktureret og kan forespørges på. Det sidder oven på et regulært udtryk (regex) og bruger tekstmønstre til at matche strenge i logfiler.
Som vi vil se i de følgende afsnit, gør brugen af Grok en stor forskel, når det kommer til effektiv logstyring.
Uden Grok er dine logdata ustrukturerede
Uden Grok, når logs sendes fra Logstash til Elasticsearch og gengives i Kibana, vises de kun i meddelelsesværdien.
Det er svært at forespørge efter meningsfuld information i denne situation, fordi alle logdata er gemt i en enkelt nøgle. Det ville være bedre, hvis logmeddelelserne var bedre organiseret.
Ustrukturerede data fra logfiler
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0
Hvis du ser nærmere på de rå data, vil du se, at de faktisk består af forskellige dele, hver adskilt af et mellemrum.
For mere erfarne udviklere kan du sikkert gætte, hvad hver af delene betyder, og hvad den logmeddelelse er fra API-kaldet. Præsentationen af hvert punkt er skitseret nedenfor.
Struktureret syn på vores data
- localhost == miljø
- GET == metode
- /v2/applink/5c2f4bb3e9fda1234edc64d == url
- 400 == respons_status
- 46ms == respons_tid
- 5bc6e716b5d6cb35fc9687c0 == user_id
Som vi ser i strukturerede data, er der en ordre på ustrukturerede logfiler. Næste trin er softwarebehandling af rådata. Det er her Grok skinner.
Grok skabeloner
Indbyggede Grok skabeloner
Logstash kommer med over 100 indbyggede skabeloner til strukturering af ustrukturerede data. Du bør helt sikkert drage fordel af dette, når det er muligt for generelle syslogs som apache, linux, haproxy, aws og så videre.
Men hvad sker der, når du har brugerdefinerede logfiler som i eksemplet ovenfor? Du skal bygge din egen Grok-skabelon.
Brugerdefinerede Grok skabeloner
Du skal prøve at bygge din egen Grok skabelon. jeg brugte
Bemærk, at Grok-skabelonens syntaks er som følger: %{SYNTAX:SEMANTIC}
Det første, jeg prøvede at gøre, var at gå til fanen Opdag i Grok debugger. Jeg troede, det ville være fedt, hvis dette værktøj automatisk kunne generere et Grok-mønster, men det var ikke så nyttigt, da det kun fandt to matcher.
Ved at bruge denne opdagelse begyndte jeg at skabe min egen skabelon i Grok-debuggeren ved hjælp af syntaksen, der findes på Elastic Github-siden.
Efter at have leget med forskellige syntakser, var jeg endelig i stand til at strukturere logdataene, som jeg ville.
Grok Debugger Link
Original tekst:
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0
Mønster:
%{WORD:environment} %{WORD:method} %{URIPATH:url} %{NUMBER:response_status} %{WORD:response_time} %{USERNAME:user_id}
Hvad skete der til sidst
{
"environment": [
[
"localhost"
]
],
"method": [
[
"GET"
]
],
"url": [
[
"/v2/applink/5c2f4bb3e9fda1234edc64d"
]
],
"response_status": [
[
"400"
]
],
"BASE10NUM": [
[
"400"
]
],
"response_time": [
[
"46ms"
]
],
"user_id": [
[
"5bc6e716b5d6cb35fc9687c0"
]
]
}
Med Grok-skabelonen og kortlagte data i hånden er det sidste trin at tilføje det til Logstash.
Opdatering af Logstash.conf-konfigurationsfilen
På serveren, hvor du installerede ELK-stakken, skal du gå til Logstash-konfigurationen:
sudo vi /etc/logstash/conf.d/logstash.conf
Indsæt ændringerne.
input {
file {
path => "/your_logs/*.log"
}
}
filter{
grok {
match => { "message" => "%{WORD:environment} %{WORD:method} %{URIPATH:url} %{NUMBER:response_status} %{WORD:response_time} %{USERNAME:user_id}"}
}
}
output {
elasticsearch {
hosts => [ "localhost:9200" ]
}
}
Når du har gemt dine ændringer, skal du genstarte Logstash og kontrollere dens status for at sikre, at den stadig fungerer.
sudo service logstash restart
sudo service logstash status
Endelig, for at sikre, at ændringerne er trådt i kraft, Sørg for at opdatere dit Elasticsearch-indeks for Logstash i Kibana!
Med Grok er dine logdata struktureret!
Som vi kan se på billedet ovenfor, er Grok i stand til automatisk at matche logdata med Elasticsearch. Dette gør det nemmere at administrere logfiler og hurtigt forespørge oplysninger. I stedet for at grave gennem logfiler for at fejlfinde, kan du blot filtrere efter det, du leder efter, såsom et miljø eller en url.
Prøv Grok udtryk! Hvis du har en anden måde at gøre dette på eller har problemer med eksemplerne ovenfor, skal du bare skrive en kommentar nedenfor for at fortælle mig det.
Tak fordi du læste - og følg mig venligst her på Medium for flere interessante artikler om softwareudvikling!
ressourcer
PS
Telegram kanal af
Kilde: www.habr.com