Strukturi nestrukturitajn datenojn kun GROK
Se vi uzas la stakon Elastic (ELK) kaj interesiĝas pri mapado de kutimaj Logstash protokoloj al Elasticsearch, tiam ĉi tiu afiŝo estas por vi.
La ELK-stako estas akronimo por tri malfermfontaj projektoj: Elasticsearch, Logstash kaj Kibana. Kune ili formas log-administran platformon.
- Elasta esploro estas serĉa kaj analiza sistemo.
- Logstash estas servilflanka datumtraktaddukto, kiu ingestas datumojn de pluraj fontoj samtempe, transformas ĝin, kaj poste sendas ĝin al "stash" kiel ekzemple Elasticsearch.
- Kibana permesas al uzantoj bildigi datumojn per diagramoj kaj grafikaĵoj en Elasticsearch.
Batiloj venis poste kaj estas malpeza datuma ekspedisto. La enkonduko de Beats transformis la Elk-Stakon en la Elastan Stakon, sed tio ne estas la punkto.
Ĉi tiu artikolo temas pri Grok, kiu estas trajto en Logstash, kiu povas transformi viajn protokolojn antaŭ ol ili estas senditaj al la kaŝejo. Por niaj celoj, mi nur parolos pri prilaborado de datumoj de Logstash en Elasticsearch.
Grok estas filtrilo ene de Logstash, kiu estas uzata por analizi nestrukturitajn datumojn en ion strukturitan kaj demandeblan. Ĝi sidas super regula esprimo (regex) kaj uzas tekstajn ŝablonojn por kongrui ĉenojn en protokolaj dosieroj.
Kiel ni vidos en la sekvaj sekcioj, uzi Grok faras grandan diferencon kiam temas pri efika administrado de protokoloj.
Sen Grok viaj protokolaj datumoj estas nestrukturitaj
Sen Grok, kiam protokoloj estas senditaj de Logstash al Elasticsearch kaj prezentitaj en Kibana, ili nur aperas en la mesaĝvaloro.
Demandi signifajn informojn en ĉi tiu situacio estas malfacila ĉar ĉiuj protokolaj datumoj estas konservitaj en ununura ŝlosilo. Pli bone estus, se la protokolaj mesaĝoj estus pli bone organizitaj.
Nestrukturitaj datumoj de protokoloj
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0
Se vi rigardas atente la krudajn datumojn, vi vidos, ke ĝi fakte konsistas el malsamaj partoj, ĉiu apartigita per spaco.
Por pli spertaj programistoj, vi verŝajne povas diveni, kion signifas ĉiu el la partoj kaj kio estas tiu protokolo-mesaĝo de la API-voko. La prezento de ĉiu objekto estas skizita malsupre.
Strukturita vido de niaj datumoj
- localhost == medio
- GET == metodo
- /v2/applink/5c2f4bb3e9fda1234edc64d == url
- 400 == respondo_stato
- 46ms == tempo_responda
- 5bc6e716b5d6cb35fc9687c0 == user_id
Kiel ni vidas en strukturitaj datumoj, ekzistas ordo por nestrukturitaj protokoloj. La sekva paŝo estas programara prilaborado de krudaj datumoj. Jen kie Grok brilas.
Grok Ŝablonoj
Enkonstruitaj Grok-ŝablonoj
Logstash venas kun pli ol 100 enkonstruitaj ŝablonoj por strukturi nestrukturitajn datumojn. Vi nepre devus utiligi ĉi tion kiam ajn eblas por ĝeneralaj sislogs kiel apache, linukso, haproxy, aws ktp.
Tamen, kio okazas kiam vi havas kutimajn protokolojn kiel en la supra ekzemplo? Vi devas konstrui vian propran Grok-ŝablonon.
Propraj Grok-ŝablonoj
Vi devas provi konstrui vian propran Grok-ŝablonon. mi uzis
Notu ke la Grok-ŝablona sintakso estas jena: %{SYNTAX:SEMANTIC}
La unua afero, kiun mi provis fari, estis iri al la langeto Discover en la Grok-erarseĉilo. Mi pensis, ke estus bonega se ĉi tiu ilo povus aŭtomate generi Grok-ŝablonon, sed ĝi ne estis tro utila ĉar ĝi nur trovis du kongruojn.
Uzante ĉi tiun malkovron, mi komencis krei mian propran ŝablonon en la Grok-erarseĉilo uzante la sintakson trovitan sur la paĝo Elastic Github.
Post ludado kun malsamaj sintaksoj, mi finfine povis strukturi la protokolojn kiel mi volis.
Ligo de Grok Debugger
Originala teksto:
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0
Skemo:
%{WORD:environment} %{WORD:method} %{URIPATH:url} %{NUMBER:response_status} %{WORD:response_time} %{USERNAME:user_id}
Kio okazis finfine
{
"environment": [
[
"localhost"
]
],
"method": [
[
"GET"
]
],
"url": [
[
"/v2/applink/5c2f4bb3e9fda1234edc64d"
]
],
"response_status": [
[
"400"
]
],
"BASE10NUM": [
[
"400"
]
],
"response_time": [
[
"46ms"
]
],
"user_id": [
[
"5bc6e716b5d6cb35fc9687c0"
]
]
}
Kun la ŝablono Grok kaj mapitaj datumoj en la mano, la lasta paŝo estas aldoni ĝin al Logstash.
Ĝisdatigante la agordan dosieron Logstash.conf
Sur la servilo, kie vi instalis la ELK-stakon, iru al la agordo Logstash:
sudo vi /etc/logstash/conf.d/logstash.conf
Algluu la ŝanĝojn.
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" ]
}
}
Post konservi viajn ŝanĝojn, rekomencu Logstash kaj kontrolu ĝian staton por certigi, ke ĝi ankoraŭ funkcias.
sudo service logstash restart
sudo service logstash status
Fine, por certigi, ke la ŝanĝoj efektiviĝis, Nepre ĝisdatigu vian Elasticsearch-indekson por Logstash en Kibana!
Kun Grok, viaj protokolaj datumoj estas strukturitaj!
Kiel ni povas vidi en la supra bildo, Grok kapablas aŭtomate kongrui protokolaj datumoj kun Elasticsearch. Ĉi tio faciligas administri protokolojn kaj rapide pridemandi informojn. Anstataŭ fosi tra protokolaj dosieroj por sencimi, vi povas simple filtri laŭ tio, kion vi serĉas, kiel medio aŭ url.
Provu Grok-esprimojn! Se vi havas alian manieron fari tion aŭ havas problemojn kun la supraj ekzemploj, simple skribu komenton sube por sciigi min.
Dankon pro legado—kaj bonvolu sekvi min ĉi tie ĉe Medium por pli interesaj artikoloj pri programaro-inĝenierado!
Rimedoj
PS
Telegram-kanalo de
fonto: www.habr.com