Strutturare dati non strutturati con GROK
Se utilizzi lo stack Elastic (ELK) e sei interessato a mappare i log Logstash personalizzati su Elasticsearch, questo post fa per te.
Lo stack ELK è l'acronimo di tre progetti open source: Elasticsearch, Logstash e Kibana. Insieme formano una piattaforma di gestione dei log.
- elasticsearch è un sistema di ricerca e analisi.
- Logstash è una pipeline di elaborazione dati lato server che acquisisce dati da più fonti contemporaneamente, li trasforma e quindi li invia a una "stash" come Elasticsearch.
- Kibana consente agli utenti di visualizzare i dati utilizzando diagrammi e grafici in Elasticsearch.
Beats è arrivato più tardi ed è un trasportatore di dati leggero. L'introduzione di Beats ha trasformato l'Elk Stack nell'Elastic Stack, ma non è questo il punto.
Questo articolo riguarda Grok, una funzionalità di Logstash che può trasformare i tuoi log prima che vengano inviati allo stash. Per i nostri scopi, parlerò solo dell'elaborazione dei dati da Logstash in Elasticsearch.
Grok è un filtro all'interno di Logstash che viene utilizzato per analizzare i dati non strutturati in qualcosa di strutturato e interrogabile. Si trova sopra un'espressione regolare (regex) e utilizza modelli di testo per abbinare le stringhe nei file di registro.
Come vedremo nelle sezioni seguenti, l'utilizzo di Grok fa una grande differenza quando si tratta di una gestione efficiente dei log.
Senza Grok i tuoi dati di registro non sono strutturati
Senza Grok, quando i log vengono inviati da Logstash a Elasticsearch e renderizzati in Kibana, appaiono solo nel valore del messaggio.
Richiedere informazioni significative in questa situazione è difficile perché tutti i dati di registro sono archiviati in un'unica chiave. Sarebbe meglio se i messaggi di registro fossero organizzati meglio.
Dati non strutturati dai log
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0
Se osservi attentamente i dati grezzi, vedrai che in realtà sono costituiti da parti diverse, ciascuna separata da uno spazio.
Per gli sviluppatori più esperti, probabilmente puoi indovinare cosa significa ciascuna parte e quale messaggio di registro proviene dalla chiamata API. La presentazione di ciascuna voce è descritta di seguito.
Visualizzazione strutturata dei nostri dati
- localhost == ambiente
- GET == metodo
- /v2/applink/5c2f4bb3e9fda1234edc64d == url
- 400 == stato_risposta
- 46ms == tempo_risposta
- 5bc6e716b5d6cb35fc9687c0 == user_id
Come vediamo nei dati strutturati, esiste un ordine per i log non strutturati. Il passo successivo è l'elaborazione software dei dati grezzi. È qui che Grok brilla.
Modelli Grok
Modelli Grok integrati
Logstash viene fornito con oltre 100 modelli integrati per strutturare dati non strutturati. Dovresti assolutamente trarne vantaggio quando possibile per syslog generali come apache, linux, haproxy, aws e così via.
Tuttavia, cosa succede quando disponi di registri personalizzati come nell'esempio sopra? Devi creare il tuo modello Grok.
Modelli Grok personalizzati
Devi provare a creare il tuo modello Grok. ero solito
Tieni presente che la sintassi del modello Grok è la seguente: %{SYNTAX:SEMANTIC}
La prima cosa che ho provato a fare è stata andare alla scheda Scoprire nel debugger di Grok. Ho pensato che sarebbe stato bello se questo strumento potesse generare automaticamente un pattern Grok, ma non era molto utile poiché trovava solo due corrispondenze.
Utilizzando questa scoperta, ho iniziato a creare il mio modello nel debugger Grok utilizzando la sintassi trovata nella pagina Elastic Github.
Dopo aver giocato con diverse sintassi, sono finalmente riuscito a strutturare i dati di registro come volevo.
Collegamento al debugger di Grok
Testo originale:
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0
Motivo:
%{WORD:environment} %{WORD:method} %{URIPATH:url} %{NUMBER:response_status} %{WORD:response_time} %{USERNAME:user_id}
Cosa è successo alla fine
{
"environment": [
[
"localhost"
]
],
"method": [
[
"GET"
]
],
"url": [
[
"/v2/applink/5c2f4bb3e9fda1234edc64d"
]
],
"response_status": [
[
"400"
]
],
"BASE10NUM": [
[
"400"
]
],
"response_time": [
[
"46ms"
]
],
"user_id": [
[
"5bc6e716b5d6cb35fc9687c0"
]
]
}
Con il modello Grok e i dati mappati in mano, l'ultimo passaggio è aggiungerlo a Logstash.
Aggiornamento del file di configurazione Logstash.conf
Sul server su cui hai installato lo stack ELK, vai alla configurazione Logstash:
sudo vi /etc/logstash/conf.d/logstash.conf
Incolla le modifiche.
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" ]
}
}
Dopo aver salvato le modifiche, riavvia Logstash e controlla il suo stato per assicurarti che funzioni ancora.
sudo service logstash restart
sudo service logstash status
Infine, per garantire che le modifiche abbiano avuto effetto, Assicurati di aggiornare il tuo indice Elasticsearch per Logstash in Kibana!
Con Grok i tuoi dati di log sono strutturati!
Come possiamo vedere nell'immagine sopra, Grok è in grado di abbinare automaticamente i dati di registro con Elasticsearch. Ciò semplifica la gestione dei registri e l'interrogazione rapida delle informazioni. Invece di scavare nei file di registro per eseguire il debug, puoi semplicemente filtrare in base a ciò che stai cercando, ad esempio un ambiente o un URL.
Prova le espressioni Grok! Se conosci un altro modo per farlo o riscontri problemi con gli esempi sopra, scrivi semplicemente un commento qui sotto per farcelo sapere.
Grazie per aver letto e seguimi qui su Medium per articoli più interessanti sull'ingegneria del software!
Ресурсы
Canale Telegram di
Fonte: habr.com