Strutturazione di dati non strutturati con GROK
Se utilizzi il stack Elastic (ELK) e sei interessato a mappare i log personalizzati di Logstash su Elasticsearch, questo post è per te.

Lo stack ELK è un acronimo per 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 server per l'elaborazione dei dati, che raccoglie dati da più fonti contemporaneamente, li trasforma e poi li invia a un “nido”, come Elasticsearch.
- Kibana consente agli utenti di visualizzare i dati tramite grafici e diagrammi in Elasticsearch.
Beats è stato introdotto in seguito ed è un leggero caricatore di dati. L'introduzione di Beats ha trasformato Elk Stack in Elastic Stack, ma non è il punto principale.
Questo articolo è dedicato a Grok, che è una funzione in Logstash in grado di trasformare i tuoi log prima che vengano inviati al nido. Ai nostri fini parlerò solo dell'elaborazione dei dati da Logstash a Elasticsearch.

Grok è un filtro all'interno di Logstash utilizzato per analizzare dati non strutturati in qualcosa di strutturato e ricercabile. Si basa sulle espressioni regolari (regex) e utilizza modelli di testo per mappare le righe nei file di log.
Come vedremo nelle sezioni successive, l'uso di Grok è fondamentale per una gestione efficace dei log.
Senza Grok i tuoi dati di log sono non strutturati

Senza Grok, quando i log vengono inviati da Logstash a Elasticsearch e visualizzati in Kibana, appaiono solo nel valore del messaggio.
Richiedere informazioni significative in questa situazione è difficile, poiché tutti i dati di log sono memorizzati in una sola chiave. Sarebbe meglio se i messaggi di log fossero organizzati meglio.
Dati non strutturati dai log
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0Se guardi attentamente i dati grezzi, vedrai che in realtà consistono di diverse parti, ognuna separata da uno spazio.
Per sviluppatori più esperti, probabilmente puoi indovinare cosa significano ciascuna delle parti e che questo è un messaggio di log di una chiamata API. La descrizione di ogni punto è riportata di seguito.
Forma strutturata dei nostri dati
- localhost == ambiente
- GET == metodo
- /v2/applink/5c2f4bb3e9fda1234edc64d == url
- 400 == response_status
- 46ms == response_time
- 5bc6e716b5d6cb35fc9687c0 == user_id
Come possiamo vedere nei dati strutturati, esiste un ordine per i log non strutturati. Il passo successivo è l'elaborazione programmatica dei dati grezzi. È qui che Grok brilla.
Modelli Grok
Modelli Grok integrati
Logstash viene fornito con oltre 100 modelli integrati per strutturare i dati non strutturati. Dovresti sicuramente approfittarne quando possibile per i log di sistema comuni, come apache, linux, haproxy, aws e così via.
Tuttavia, cosa succede quando hai log personalizzati, come nell'esempio sopra? Devi costruire il tuo stesso modello Grok.
Modelli Grok personalizzati
Devo provare a costruire il mio modello Grok. Ho usato e .
Nota che la sintassi dei modelli Grok appare come segue: %{SYNTAX:SEMANTIC}
La prima cosa che ho cercato di fare è stata passare alla scheda Discover nel debugger Grok. Ho pensato che sarebbe stato bello se questo strumento potesse generare automaticamente un modello Grok, ma non è stato molto utile, poiché ha trovato solo due corrispondenze.

Utilizzando questa scoperta, ho iniziato a creare il mio modello nel debugger Grok, usando la sintassi trovata sulla pagina Github Elastic.

Sperimentando con diverse sintassi, alla fine sono riuscito a strutturare i dati del log nel modo in cui desideravo.

Link al debugger Grok
Testo originale:
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0Pattern:
%{WORD:environment} %{WORD:method} %{URIPATH:url} %{NUMBER:response_status} %{WORD:response_time} %{USERNAME:user_id}Ciò che è stato ottenuto alla fine
{
"environment": [
[
"localhost"
]
],
"method": [
[
"GET"
]
],
"url": [
[
"\/v2\/applink\/5c2f4bb3e9fda1234edc64d"
]
],
"response_status": [
[
"400"
]
],
"BASE10NUM": [
[
"400"
]
],
"response_time": [
[
"46ms"
]
],
"user_id": [
[
"5bc6e716b5d6cb35fc9687c0"
]
]
}Avendo a disposizione il modello Grok e i dati mappati, l'ultimo passo è aggiungerlo a Logstash.
Aggiornamento del file di configurazione Logstash.conf
Sul server in cui hai installato lo stack ELK, vai alla configurazione di Logstash:
sudo vi /etc/logstash/conf.d/logstash.confIncolla 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 stia ancora funzionando.
sudo service logstash restart
sudo service logstash statusInfine, per assicurarti che le modifiche siano state applicate, assicurati di aggiornare l'indice Elasticsearch per Logstash in Kibana!

Con Grok i tuoi dati dai log sono strutturati!

Come possiamo vedere nell'immagine qui sopra, Grok è in grado di mappare automaticamente i dati dei log su Elasticsearch. Questo semplifica la gestione dei log e la rapida richiesta di informazioni. Invece di frugare nei file di log per il debug, puoi semplicemente filtrare ciò che stai cercando, come l'ambiente o l'URL.
Prova a dare a Grok expressions un'opportunità! Se hai un altro modo per farlo o hai domande sugli esempi sopra, scrivi un commento qui sotto per farmelo sapere.
Grazie per la lettura — e, per favore, seguimi qui su Medium per altri articoli interessanti sull'ingegneria del software!
Risorse
P.S
Canale Telegram su
Fonte: habr.com
