Strukturering av ostrukturerade data med GROK
Om du anvÀnder Elastic-stack (ELK) och Àr intresserad av att matcha anvÀndarloggar frÄn Logstash med Elasticsearch, sÄ Àr det hÀr inlÀgget för dig.

ELK-stack Àr en akronym för tre öppen kÀllkod-projekt: Elasticsearch, Logstash och Kibana. Tillsammans bildar de en plattform för logghantering.
- Elasticsearch â Ă€r ett sök- och analysystem.
- Logstash â Ă€r en serverkonveyor för databehandling som tar emot data frĂ„n flera kĂ€llor samtidigt, omvandlar dem och skickar dem sedan till en "lagringsplats", till exempel Elasticsearch.
- Kibana möjliggör för anvÀndare att visualisera data med diagram och grafer i Elasticsearch.
Beats kom senare och Àr en lÀttviktsdatasÀndare. Introduktionen av Beats omvandlade Elk Stack till Elastic Stack, men det Àr inte huvudpoÀngen.
Den hÀr artikeln Àr dedikerad till Grok, som Àr en funktion i Logstash som kan omvandla dina loggar innan de skickas till lagringsplatsen. För vÄra syften kommer jag att prata om databehandling frÄn Logstash till Elasticsearch.

Grok Àr en filter i Logstash som anvÀnds för att analysera ostrukturerade data till nÄgot strukturerat och sökbart. Den ligger ovanpÄ reguljÀra uttryck (regex) och anvÀnder textmönster för att matcha rader i loggfiler.
Som vi kommer att se i följande avsnitt Àr anvÀndningen av Grok av stor vikt nÀr det gÀller effektiv logghantering.
Utan Grok Àr dina loggdata ostrukturerade.

Utan Grok, nÀr loggar skickas frÄn Logstash till Elasticsearch och visualiseras i Kibana, visas de endast i meddelandets vÀrde.
Att frÄga efter meningsfull information i denna situation Àr svÄrt, eftersom all loggdata lagras i en nyckel. Det skulle vara bÀttre om loggmeddelandena var bÀttre organiserade.
Ostrukturerade data frÄn loggar
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0Om du tittar noga pÄ de rÄa data kommer du att se att de faktiskt bestÄr av olika delar, var och en Ätskild med ett mellanrum.
För mer erfarna utvecklare kan du förmodligen gissa vad var och en av delarna betyder och att detta loggmeddelande kommer frÄn ett API-anrop. Presentationen av varje punkt anges nedan.
Den strukturerade versionen av vÄra data
- â localhost == miljö
- â GET == metod
- â /v2/applink/5c2f4bb3e9fda1234edc64d == url
- â 400 == respons_status
- â 46ms == respons_tid
- â 5bc6e716b5d6cb35fc9687c0 == anvĂ€ndar_id
Som vi ser i de strukturerade data, finns det en ordning för ostrukturerade loggar. NÀsta steg Àr den programmÀssiga bearbetningen av rÄdata. HÀr lyser Grok.
Grok-mallar
Logstash levereras med mer Àn 100 inbyggda mallar för att strukturera ostrukturerade data. Du bör definitivt utnyttja detta nÀr det Àr möjligt för vanliga systemloggar som apache, linux, haproxy, aws, och sÄ vidare.
Men vad hÀnder nÀr du har anpassade loggar, som i exemplet ovan? Du mÄste bygga din egen Grok-mall.
Anpassade Grok-mallar
Det krÀvs försök för att bygga din egen Grok-mall. Jag anvÀnde
Grok Debugger och .
%{SYNTAX:SEMANTIK} Det första jag försökte göra var att gÄ till fliken
Discover i Grok-debuggern. Jag tyckte det skulle vara bra om detta verktyg kunde automatiskt generera en Grok-mall, men det var inte sÀrskilt anvÀndbart, eftersom det bara hittade tvÄ trÀffar. Genom att anvÀnda denna upptÀckte började jag skapa min egen mall i Grok-debuggern, med hjÀlp av syntaksen som fanns pÄ GitHub Elastic-sidan.

Efter att ha lekt med olika syntakser kunde jag Àntligen strukturera loggdata sÄ som jag ville.

LĂ€nk till Grok-debuggern

KĂ€lla:
Mönster:
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0%{WORD:miljö} %{WORD:metod} %{URIPATH:url} %{NUMBER:respons_status} %{WORD:respons_tid} %{USERNAME:anvÀndar_id}
Vad som blev resultatet{ "miljö": [ [ "localhost" ] ], "metod": [ [ "GET" ] ], "url": [ [ "/v2/applink/5c2f4bb3e9fda1234edc64d" ] ], "respons_status": [ [ "400" ] ], "BASE10NUM": [ [ "400" ] ], "respons_tid": [ [ "46ms" ] ], "anvÀndar_id": [ [ "5bc6e716b5d6cb35fc9687c0" ] ] }
Med Grok-mallen och de matchande datan i handen, Àr det sista steget att lÀgga till den i Logstash.Uppdatera Logstash.conf konfigurationsfilen
PÄ servern dÀr du har installerat ELK-stacken, gÄ till Logstash-konfigurationen:
sudo vi /etc/logstash/conf.d/logstash.conf
Klistra in Àndringarna.input { file { path => "/your_logs/*.log" } } filter{ grok { match => { "message" => "%{WORD:miljö} %{WORD:metod} %{URIPATH:url} %{NUMBER:respons_status} %{WORD:respons_tid} %{USERNAME:anvÀndar_id}"} } } output { elasticsearch { hosts => [ "localhost:9200" ] } }
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 Àndringarna har sparats, starta om Logstash och kontrollera dess status för att sÀkerstÀlla att det fortfarande fungerar.
sudo service logstash restart
sudo service logstash statusSlutligen, för att sÀkerstÀlla att förÀndringarna har trÀtt i kraft, kom ihÄg att uppdatera Elasticsearch-indexet för Logstash i Kibana!

Med Grok Àr dina loggdata strukturerade!

Som vi ser pÄ bilden ovan kan Grok automatiskt mappa loggdata till Elasticsearch. Detta underlÀttar logghantering och snabb informationsfrÄga. IstÀllet för att grÀva i loggfiler för felsökning kan du helt enkelt filtrera det du söker, som miljön eller url-adressen.
Ge Grok expressions en chans! Om du har ett annat sÀtt att göra detta eller har nÄgra problem med exemplen ovan, skriv bara en kommentar nedan för att lÄta mig veta.
Tack för att du lĂ€ste â och följ gĂ€rna mig hĂ€r pĂ„ Medium för fler intressanta artiklar om mjukvaruteknik!
Resurser
P.S
Telegramkanal om
KĂ€lla: habr.com
