Structureren van ongestructureerde data met GROK
Als je de Elastic (ELK)-stack gebruikt en geïnteresseerd bent in het toewijzen van aangepaste Logstash-logboeken aan Elasticsearch, dan is dit bericht iets voor jou.
De ELK-stack is een acroniem voor drie open source-projecten: Elasticsearch, Logstash en Kibana. Samen vormen ze een logbeheerplatform.
- Elasticsearch is een zoek- en analysesysteem.
- Logstash is een gegevensverwerkingspijplijn aan de serverzijde die tegelijkertijd gegevens uit meerdere bronnen opneemt, transformeert en vervolgens naar een “stash” zoals Elasticsearch stuurt.
- Kibana stelt gebruikers in staat gegevens te visualiseren met behulp van grafieken en grafieken in Elasticsearch.
Beats kwam later en is een lichtgewicht gegevensverzender. De introductie van Beats transformeerde de Elk Stack in de Elastic Stack, maar daar gaat het niet om.
Dit artikel gaat over Grok, een functie in Logstash die je logs kan transformeren voordat ze naar de stash worden gestuurd. Voor onze doeleinden zal ik het alleen hebben over het verwerken van gegevens van Logstash in Elasticsearch.
Grok is een filter binnen Logstash dat wordt gebruikt om ongestructureerde gegevens te parseren in iets gestructureerds en bevraagbaar. Het bevindt zich bovenop een reguliere expressie (regex) en gebruikt tekstpatronen om tekenreeksen in logbestanden met elkaar te matchen.
Zoals we in de volgende paragrafen zullen zien, maakt het gebruik van Grok een groot verschil als het gaat om efficiënt logbeheer.
Zonder Grok zijn uw loggegevens ongestructureerd
Wanneer logboeken zonder Grok van Logstash naar Elasticsearch worden verzonden en in Kibana worden weergegeven, verschijnen ze alleen in de berichtwaarde.
Het opvragen van betekenisvolle informatie is in deze situatie moeilijk omdat alle loggegevens in één sleutel zijn opgeslagen. Het zou beter zijn als de logberichten beter georganiseerd waren.
Ongestructureerde gegevens uit logboeken
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0
Als je goed naar de ruwe data kijkt, zie je dat deze feitelijk uit verschillende delen bestaat, elk gescheiden door een spatie.
Voor meer ervaren ontwikkelaars kun je waarschijnlijk raden wat elk van de onderdelen betekent en wat het logbericht is van de API-aanroep. Hieronder wordt de presentatie van elk item beschreven.
Gestructureerde weergave van onze gegevens
- localhost == omgeving
- GET == methode
- /v2/applink/5c2f4bb3e9fda1234edc64d == url
- 400 == antwoord_status
- 46ms == responstijd
- 5bc6e716b5d6cb35fc9687c0 == user_id
Zoals we zien bij gestructureerde gegevens, is er een volgorde voor ongestructureerde logboeken. De volgende stap is de softwarematige verwerking van ruwe data. Dit is waar Grok schittert.
Grok-sjablonen
Ingebouwde Grok-sjablonen
Logstash wordt geleverd met meer dan 100 ingebouwde sjablonen voor het structureren van ongestructureerde gegevens. Je moet hier waar mogelijk zeker van profiteren voor algemene syslogs zoals apache, linux, haproxy, aws enzovoort.
Wat gebeurt er echter als u aangepaste logboeken heeft, zoals in het bovenstaande voorbeeld? U moet uw eigen Grok-sjabloon bouwen.
Aangepaste Grok-sjablonen
Je moet proberen je eigen Grok-sjabloon te bouwen. ik gebruikte
Merk op dat de syntaxis van de Grok-sjabloon als volgt is: %{SYNTAX:SEMANTIC}
Het eerste wat ik probeerde te doen was naar het tabblad gaan Discover in de Grok-foutopsporing. Ik dacht dat het cool zou zijn als deze tool automatisch een Grok-patroon zou kunnen genereren, maar het was niet zo handig omdat het maar twee overeenkomsten vond.
Met behulp van deze ontdekking begon ik mijn eigen sjabloon te maken in de Grok-foutopsporing met behulp van de syntaxis die te vinden is op de Elastic Github-pagina.
Nadat ik met verschillende syntaxis had gespeeld, kon ik eindelijk de loggegevens structureren zoals ik dat wilde.
Grok-foutopsporingslink
Originele tekst:
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0
Patroon:
%{WORD:environment} %{WORD:method} %{URIPATH:url} %{NUMBER:response_status} %{WORD:response_time} %{USERNAME:user_id}
Wat gebeurde er op het einde
{
"environment": [
[
"localhost"
]
],
"method": [
[
"GET"
]
],
"url": [
[
"/v2/applink/5c2f4bb3e9fda1234edc64d"
]
],
"response_status": [
[
"400"
]
],
"BASE10NUM": [
[
"400"
]
],
"response_time": [
[
"46ms"
]
],
"user_id": [
[
"5bc6e716b5d6cb35fc9687c0"
]
]
}
Met de Grok-sjabloon en de toegewezen gegevens in de hand, is de laatste stap het toevoegen aan Logstash.
Het configuratiebestand Logstash.conf bijwerken
Ga op de server waarop u de ELK-stack hebt geïnstalleerd naar de Logstash-configuratie:
sudo vi /etc/logstash/conf.d/logstash.conf
Plak de wijzigingen.
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" ]
}
}
Nadat u uw wijzigingen heeft opgeslagen, start u Logstash opnieuw op en controleert u de status om er zeker van te zijn dat deze nog steeds werkt.
sudo service logstash restart
sudo service logstash status
Om er ten slotte zeker van te zijn dat de wijzigingen van kracht zijn geworden, Zorg ervoor dat u uw Elasticsearch-index voor Logstash in Kibana bijwerkt!
Met Grok zijn uw loggegevens gestructureerd!
Zoals we in de bovenstaande afbeelding kunnen zien, is Grok in staat om automatisch loggegevens te matchen met Elasticsearch. Dit maakt het eenvoudiger om logboeken te beheren en snel informatie op te vragen. In plaats van door de logbestanden te bladeren om fouten op te sporen, kunt u eenvoudigweg filteren op wat u zoekt, zoals een omgeving of een URL.
Probeer Grok-uitdrukkingen eens! Als je een andere manier hebt om dit te doen of problemen hebt met de bovenstaande voorbeelden, schrijf dan hieronder een reactie om me dit te laten weten.
Bedankt voor het lezen - en volg mij hier op Medium voor meer interessante artikelen over software-engineering!
Ресурсы
Telegramkanaal door
Bron: www.habr.com