Estruturando dados não estruturados com GROK
Se você está usando o stack Elastic (ELK) e está interessado em mapear logs personalizados do Logstash para o Elasticsearch, este post é para você.

O stack ELK é uma abreviação para três projetos de código aberto: Elasticsearch, Logstash e Kibana. Juntos, eles formam uma plataforma de gerenciamento de logs.
- Elasticsearch – é um sistema de busca e análise.
- Logstash – é um pipeline de processamento de dados que recebe dados de várias fontes simultaneamente, transforma-os e, em seguida, os envia para um 'stash', como o Elasticsearch.
- Kibana permite que os usuários visualizem dados usando gráficos e diagramas no Elasticsearch.
Beats surgiu mais tarde e é um coletor de dados leve. A introdução do Beats transformou o Elk Stack em Elastic Stack, mas isso não é o principal.
Este artigo é dedicado ao Grok, que é uma função no Logstash que pode transformar seus logs antes que eles sejam enviados para o stash. Para nossos propósitos, vou falar apenas sobre o processamento de dados do Logstash para o Elasticsearch.

Grok é um filtro dentro do Logstash que é usado para analisar dados não estruturados em algo estruturado e consultável. Ele está baseado em expressões regulares (regex) e usa padrões de texto para corresponder strings em arquivos de log.
Como veremos nas seções seguintes, o uso do Grok é fundamental quando se trata de gerenciamento eficaz de logs.
Sem Grok, seus dados de log estão não estruturados.

Sem Grok, quando os logs são enviados do Logstash para o Elasticsearch e visualizados no Kibana, eles aparecem apenas no valor da mensagem.
Solicitar informações significativas nessa situação é difícil, pois todos os dados de log estão armazenados em uma única chave. Seria melhor se as mensagens de log fossem organizadas de forma mais eficiente.
Dados não estruturados de logs
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0Se você olhar atentamente para os dados brutos, verá que na verdade consistem em diferentes partes, cada uma das quais é separada por um espaço.
Para desenvolvedores mais experientes, você provavelmente consegue adivinhar o que significa cada uma das partes e que esta é uma mensagem de log de uma chamada de API. A apresentação de cada item está descrita abaixo.
Visualização estruturada dos nossos dados
- localhost == ambiente
- GET == método
- /v2/applink/5c2f4bb3e9fda1234edc64d == url
- 400 == status_resposta
- 46ms == tempo_resposta
- 5bc6e716b5d6cb35fc9687c0 == user_id
Como vemos nos dados estruturados, há uma ordem para os logs não estruturados. O próximo passo é o processamento programático dos dados brutos. É aqui que o Grok brilha.
Templates Grok
Templates Grok embutidos
O Logstash vem com mais de 100 templates embutidos para estruturar dados não estruturados. Você definitivamente deve aproveitar isso quando possível para logs de sistemas comuns, como apache, linux, haproxy, aws e assim por diante.
No entanto, o que acontece quando você tem logs personalizados, como no exemplo acima? Você precisa construir seu próprio template Grok.
Templates Grok personalizados
É preciso experimentar para construir seu próprio template Grok. Eu usei e .
Observe que a sintaxe dos templates Grok é a seguinte: %{SYNTAX:SEMANTIC}
A primeira coisa que tentei fazer foi ir para a aba Discover no Debugger Grok. Eu pensei que seria ótimo se essa ferramenta pudesse gerar automaticamente um template Grok, mas não foi muito útil, pois encontrou apenas duas correspondências.

Usando essa descoberta, comecei a construir meu próprio template no Debugger Grok, utilizando a sintaxe encontrada na página do Github Elastic.

Brincando com diferentes sintaxes, finalmente consegui estruturar os dados do log da maneira que eu queria.

Link para o Debugger Grok
Texto original:
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0Padrão:
%{WORD:environment} %{WORD:method} %{URIPATH:url} %{NUMBER:response_status} %{WORD:response_time} %{USERNAME:user_id}O que resultou no final
{
"environment": [
[
"localhost"
]
],
"method": [
[
"GET"
]
],
"url": [
[
"/v2/applink/5c2f4bb3e9fda1234edc64d"
]
],
"response_status": [
[
"400"
]
],
"BASE10NUM": [
[
"400"
]
],
"response_time": [
[
"46ms"
]
],
"user_id": [
[
"5bc6e716b5d6cb35fc9687c0"
]
]
}Com o template Grok e os dados mapeados em mãos, o último passo é adicioná-lo ao Logstash.
Atualização do arquivo de configuração Logstash.conf
No servidor onde você instalou o stack ELK, vá para a configuração do Logstash:
sudo vi /etc/logstash/conf.d/logstash.confInsira as alterações.
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" ]
}
}Após salvar as alterações, reinicie o Logstash e verifique seu status para garantir que ele ainda está funcionando.
sudo service logstash restart
sudo service logstash statusPor fim, para garantir que as alterações tenham efeito, não esqueça de atualizar o índice Elasticsearch para Logstash no Kibana!

Com Grok, seus dados de logs estão estruturados!

Como podemos ver na imagem acima, o Grok é capaz de mapear automaticamente os dados de log com o Elasticsearch. Isso facilita o gerenciamento de logs e consultas rápidas de informações. Em vez de vasculhar arquivos de log para depuração, você pode simplesmente filtrar o que está procurando, como o ambiente ou o URL.
Dê uma chance às expressões Grok! Se você tem outra maneira de fazer isso ou se tiver algum problema com os exemplos acima, basta deixar um comentário abaixo para me avisar.
Obrigado pela leitura — e, por favor, me siga aqui no Medium para mais artigos interessantes sobre engenharia de software!
Recursos
P.S
Canal do Telegram sobre
Fonte: habr.com
