Dicas e recomendações para transformar dados não estruturados de logs no ELK Stack usando GROK no LogStash

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ê.

Dicas e recomendações para transformar dados não estruturados de logs no ELK Stack usando GROK no LogStash

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.

Dicas e recomendações para transformar dados não estruturados de logs no ELK Stack usando GROK no LogStash

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.

Dicas e recomendações para transformar dados não estruturados de logs no ELK Stack usando GROK no LogStash

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 5bc6e716b5d6cb35fc9687c0

Se 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 Grok Debugger e Padrões Grok.

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.

Dicas e recomendações para transformar dados não estruturados de logs no ELK Stack usando GROK no LogStash

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

Dicas e recomendações para transformar dados não estruturados de logs no ELK Stack usando GROK no LogStash

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

Dicas e recomendações para transformar dados não estruturados de logs no ELK Stack usando GROK no LogStash

Link para o Debugger Grok https://grokdebug.herokuapp.com/

Texto original:

localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0

Padrã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.conf

Insira 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 status

Por fim, para garantir que as alterações tenham efeito, não esqueça de atualizar o índice Elasticsearch para Logstash no Kibana!

Dicas e recomendações para transformar dados não estruturados de logs no ELK Stack usando GROK no LogStash

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

Dicas e recomendações para transformar dados não estruturados de logs no ELK Stack usando GROK no LogStash

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

https://www.elastic.co/blog/do-you-grok-grok
https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns
https://grokdebug.herokuapp.com/

P.S Link para a fonte

Canal do Telegram sobre Elasticsearch

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster