Nestruktūruotų duomenų struktūrizavimas naudojant GROK
Jei naudojate Elastic (ELK) krūvą ir norite susieti pasirinktinius Logstash žurnalus su Elasticsearch, šis įrašas skirtas jums.
ELK stack yra trijų atvirojo kodo projektų akronimas: Elasticsearch, Logstash ir Kibana. Kartu jie sudaro žurnalų valdymo platformą.
- Elasticearch yra paieškos ir analizės sistema.
- „Logstash“ yra serverio duomenų apdorojimo dujotiekis, kuris vienu metu gauna duomenis iš kelių šaltinių, juos transformuoja ir siunčia į „atlicināt“, pvz., „Elasticsearch“.
- kibana leidžia vartotojams vizualizuoti duomenis naudojant Elasticsearch diagramas ir grafikus.
Beats atsirado vėliau ir yra lengvas duomenų siuntėjas. Beats pristatymas pavertė Elk Stack į Elastic Stack, bet tai ne esmė.
Šis straipsnis yra apie „Grok“, kuri yra „Logstash“ funkcija, kuri gali pakeisti jūsų žurnalus prieš juos siunčiant į atmintinę. Mūsų tikslais kalbėsiu tik apie duomenų apdorojimą iš „Logstash“ į „Elasticsearch“.
„Grok“ yra „Logstash“ filtras, naudojamas nestruktūriniams duomenims išanalizuoti į struktūrizuotą ir užklausą. Jis yra ant reguliariosios išraiškos (regex) ir naudoja teksto šablonus, kad atitiktų žurnalo failų eilutes.
Kaip matysime tolesniuose skyriuose, naudojant „Grok“ yra didelis skirtumas, kai reikia efektyviai valdyti žurnalus.
Be Grok jūsų žurnalo duomenys yra nestruktūrizuoti
Be Groko, kai žurnalai siunčiami iš „Logstash“ į „Elasticsearch“ ir pateikiami „Kibana“, jie rodomi tik pranešimo reikšmėje.
Šioje situacijoje sudėtinga pateikti prasmingos informacijos užklausą, nes visi žurnalo duomenys saugomi viename rakte. Būtų geriau, jei žurnalo pranešimai būtų geriau sutvarkyti.
Nestruktūruoti duomenys iš žurnalų
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0
Jei atidžiai pažvelgsite į neapdorotus duomenis, pamatysite, kad jie iš tikrųjų susideda iš skirtingų dalių, kurių kiekviena atskirta tarpu.
Labiau patyrę kūrėjai tikriausiai gali atspėti, ką reiškia kiekviena dalis ir koks tas žurnalo pranešimas iš API iškvietimo. Toliau pateikiamas kiekvieno elemento pristatymas.
Struktūrizuotas mūsų duomenų vaizdas
- localhost == aplinka
- GET == metodas
- /v2/applink/5c2f4bb3e9fda1234edc64d == url
- 400 == atsakymo_būsena
- 46 ms = = atsako_laikas
- 5bc6e716b5d6cb35fc9687c0 == user_id
Kaip matome struktūriniuose duomenyse, yra nestruktūruotų žurnalų tvarka. Kitas žingsnis yra neapdorotų duomenų programinė įranga. Čia grokas šviečia.
Groko šablonai
Integruoti Grok šablonai
„Logstash“ turi daugiau nei 100 integruotų šablonų, skirtų nestruktūrizuotiems duomenims struktūrizuoti. Turėtumėte tikrai pasinaudoti šia galimybe, kai tik įmanoma, naudodami bendruosius sistemos žurnalus, tokius kaip apache, linux, haproxy, aws ir pan.
Tačiau kas atsitiks, kai turite pasirinktinius žurnalus, kaip nurodyta aukščiau pateiktame pavyzdyje? Turite sukurti savo Grok šabloną.
Pasirinktiniai Grok šablonai
Turite pabandyti sukurti savo Grok šabloną. aš naudojau
Atminkite, kad Grok šablono sintaksė yra tokia: %{SYNTAX:SEMANTIC}
Pirmas dalykas, kurį bandžiau padaryti, buvo eiti į skirtuką Atraskite Grok deriklyje. Maniau, kad būtų puiku, jei šis įrankis galėtų automatiškai sugeneruoti Groko šabloną, bet tai nebuvo labai naudinga, nes rado tik du atitikmenis.
Naudodamas šį atradimą, aš pradėjau kurti savo šabloną Grok deriklyje, naudodamas sintaksę, esančią Elastic Github puslapyje.
Pažaidęs su skirtingomis sintaksėmis, pagaliau galėjau struktūrizuoti žurnalo duomenis taip, kaip norėjau.
Grok Debugger nuoroda
Originalus tekstas:
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0
Tiražas:
%{WORD:environment} %{WORD:method} %{URIPATH:url} %{NUMBER:response_status} %{WORD:response_time} %{USERNAME:user_id}
Kas nutiko pabaigoje
{
"environment": [
[
"localhost"
]
],
"method": [
[
"GET"
]
],
"url": [
[
"/v2/applink/5c2f4bb3e9fda1234edc64d"
]
],
"response_status": [
[
"400"
]
],
"BASE10NUM": [
[
"400"
]
],
"response_time": [
[
"46ms"
]
],
"user_id": [
[
"5bc6e716b5d6cb35fc9687c0"
]
]
}
Turėdami „Grok“ šabloną ir susietus duomenis, paskutinis veiksmas yra pridėti jį prie „Logstash“.
Logstash.conf konfigūracijos failo atnaujinimas
Serveryje, kuriame įdiegėte ELK krūvą, eikite į „Logstash“ konfigūraciją:
sudo vi /etc/logstash/conf.d/logstash.conf
Įklijuokite pakeitimus.
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" ]
}
}
Išsaugoję pakeitimus iš naujo paleiskite „Logstash“ ir patikrinkite jo būseną, kad įsitikintumėte, jog jis vis dar veikia.
sudo service logstash restart
sudo service logstash status
Galiausiai, norėdami įsitikinti, kad pakeitimai įsigaliojo, Būtinai atnaujinkite savo Elasticsearch indeksą Logstash Kibanoje!
Su Grok jūsų žurnalo duomenys yra struktūrizuoti!
Kaip matome aukščiau esančiame paveikslėlyje, Grokas gali automatiškai suderinti žurnalo duomenis su Elasticsearch. Taip lengviau tvarkyti žurnalus ir greitai pateikti informacijos užklausas. Užuot naršę žurnalo failus norėdami derinti, galite tiesiog filtruoti pagal tai, ko ieškote, pvz., aplinką arba URL.
Išbandykite Groko posakius! Jei turite kitą būdą tai padaryti arba turite kokių nors problemų dėl aukščiau pateiktų pavyzdžių, tiesiog parašykite komentarą žemiau, kad praneštumėte man.
Dėkojame, kad skaitėte – ir sekite mane čia „Medium“, kad gautumėte daugiau įdomių programinės įrangos inžinerijos straipsnių!
Ištekliai
Telegram kanalas pagal
Šaltinis: www.habr.com