Strukturiranje nestrukturiranih podatkov z GROK-om
Če uporabljate sklad Elastic (ELK) in vas zanima preslikava dnevnikov Logstash po meri v Elasticsearch, potem je ta objava za vas.
Sklad ELK je akronim za tri odprtokodne projekte: Elasticsearch, Logstash in Kibana. Skupaj tvorijo platformo za upravljanje dnevnikov.
- Elastično iskanje je iskalni in analitični sistem.
- Logstash je cevovod za obdelavo podatkov na strani strežnika, ki zaužije podatke iz več virov hkrati, jih preoblikuje in nato pošlje v »skladišče«, kot je Elasticsearch.
- Kibana uporabnikom omogoča vizualizacijo podatkov z uporabo grafikonov in grafov v Elasticsearch.
Beats prišel pozneje in je lahek pošiljatelj podatkov. Uvedba Beatsa je spremenila Elk Stack v Elastic Stack, vendar to ni bistvo.
Ta članek govori o Groku, ki je funkcija v Logstashu, ki lahko preoblikuje vaše dnevnike, preden so poslani v shrambo. Za naše namene bom govoril samo o obdelavi podatkov iz Logstasha v Elasticsearch.
Grok je filter znotraj Logstasha, ki se uporablja za razčlenitev nestrukturiranih podatkov v nekaj strukturiranega in poizvedljivega. Nahaja se na vrhu regularnega izraza (regex) in uporablja besedilne vzorce za ujemanje nizov v dnevniških datotekah.
Kot bomo videli v naslednjih razdelkih, je uporaba Groka velika razlika, ko gre za učinkovito upravljanje dnevnikov.
Brez Groka so vaši dnevniški podatki nestrukturirani
Ko so dnevniki poslani iz Logstasha v Elasticsearch in upodobljeni v Kibani brez Groka, se prikažejo samo v vrednosti sporočila.
Poizvedovanje po pomembnih informacijah v tej situaciji je težko, ker so vsi podatki dnevnika shranjeni v enem ključu. Bolje bi bilo, če bi bila sporočila dnevnika bolje organizirana.
Nestrukturirani podatki iz dnevnikov
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0
Če pozorno pogledate neobdelane podatke, boste videli, da so dejansko sestavljeni iz različnih delov, od katerih je vsak ločen s presledkom.
Bolj izkušeni razvijalci lahko verjetno ugibajo, kaj vsak del pomeni in kaj je to sporočilo dnevnika iz klica API-ja. Predstavitev vsake postavke je opisana spodaj.
Strukturiran pogled na naše podatke
- localhost == okolje
- Metoda GET ==
- /v2/applink/5c2f4bb3e9fda1234edc64d == url
- 400 == status_odgovora
- 46ms == odzivni_čas
- 5bc6e716b5d6cb35fc9687c0 == user_id
Kot vidimo pri strukturiranih podatkih, obstaja vrstni red za nestrukturirane dnevnike. Naslednji korak je programska obdelava neobdelanih podatkov. Tukaj Grok blesti.
Predloge Grok
Vgrajene predloge Grok
Logstash ima več kot 100 vgrajenih predlog za strukturiranje nestrukturiranih podatkov. Vsekakor bi morali to izkoristiti, kadar koli je to mogoče, za splošne sistemske dnevnike, kot so apache, linux, haproxy, aws in tako naprej.
Vendar, kaj se zgodi, če imate dnevnike po meri, kot je v zgornjem primeru? Ustvariti morate lastno predlogo Grok.
Predloge Grok po meri
Poskusite sestaviti lastno predlogo Grok. uporabil sem
Upoštevajte, da je sintaksa predloge Grok naslednja: %{SYNTAX:SEMANTIC}
Prva stvar, ki sem jo poskušal narediti, je bila iti na zavihek Odkrijte v razhroščevalniku Grok. Mislil sem, da bi bilo kul, če bi to orodje lahko samodejno ustvarilo vzorec Grok, vendar ni bilo preveč uporabno, saj je našlo le dve ujemki.
S tem odkritjem sem začel ustvarjati lastno predlogo v razhroščevalniku Grok z uporabo sintakse, ki jo najdem na strani Elastic Github.
Po igranju z različnimi sintaksami sem končno lahko strukturiral podatke dnevnika, kot sem želel.
Povezava za odpravljanje napak Grok
Izvirno besedilo:
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0
vzorec:
%{WORD:environment} %{WORD:method} %{URIPATH:url} %{NUMBER:response_status} %{WORD:response_time} %{USERNAME:user_id}
Kaj se je zgodilo na koncu
{
"environment": [
[
"localhost"
]
],
"method": [
[
"GET"
]
],
"url": [
[
"/v2/applink/5c2f4bb3e9fda1234edc64d"
]
],
"response_status": [
[
"400"
]
],
"BASE10NUM": [
[
"400"
]
],
"response_time": [
[
"46ms"
]
],
"user_id": [
[
"5bc6e716b5d6cb35fc9687c0"
]
]
}
S predlogo Grok in preslikanimi podatki v roki je zadnji korak, da jih dodate v Logstash.
Posodabljanje konfiguracijske datoteke Logstash.conf
Na strežniku, kjer ste namestili sklad ELK, pojdite na konfiguracijo Logstash:
sudo vi /etc/logstash/conf.d/logstash.conf
Prilepite spremembe.
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" ]
}
}
Ko shranite spremembe, znova zaženite Logstash in preverite njegovo stanje, da se prepričate, da še vedno deluje.
sudo service logstash restart
sudo service logstash status
Nazadnje, da zagotovite, da so spremembe začele veljati, Bodite prepričani, da posodobite svoj indeks Elasticsearch za Logstash v Kibani!
Z Grokom so vaši dnevniški podatki strukturirani!
Kot lahko vidimo na zgornji sliki, je Grok sposoben samodejno ujemati podatke dnevnika z Elasticsearch. To olajša upravljanje dnevnikov in hitro iskanje informacij. Namesto brskanja po dnevniških datotekah za odpravljanje napak, lahko preprosto filtrirate glede na to, kar iščete, na primer okolje ali url.
Preizkusite izraze Grok! Če imate to drugače ali imate kakršne koli težave z zgornjimi primeri, spodaj napišite komentar, da me obvestite.
Hvala za branje – in sledite mi tukaj na Mediumu za več zanimivih člankov o programskem inženiringu!
Viri
Telegram kanal avtorja
Vir: www.habr.com