Como processar dados não estruturados utilizando o Logstash com Grok Debugger

Felipe Queiroz - Tech Lipe
3 min readJan 31, 2020

--

Introdução

Olá, meu nome é Felipe Queiroz, sou Engenheiro Certificado pela Elastic e seja muito bem vindo a esse artigo que foi escrito justamente para você!

É, você mesmo, que talvez sempre soube da Elastic Stack, conhece o logstash e por fim também o Grok Debugger, essa ferramenta sensacional que consegue transformar qualquer log sem pé nem cabeça em um JSON estruturado para futura indexação.

Caso queira saber um pouco mais sobre logstash, sugiro dar uma rápida verificada em uma outra série de artigos também escrito por mim que fala mais sobre a ferramenta e implementações de esteiras de processamento de dados (pipelines).

Grok Debugger

Grok Debugger é um plugin utilizado na sessão de “filtro” de um pipeline no Logstash, que tem como principal objetivo a conversão de dados não estruturados em dados estruturados, como exemplo:

Mensagem:

[2019–12–26] INFO MensagemdoLOG: You Know for Search

Aplicando a seguinte expressão do grok em cima da mensagem:

\[%{DATA:timestamp}\] %{WORD:loglevel} MensagemdoLOG\: %{GREEDYDATA:logmessage}

Temos a seguinte estrutura:

{
"timestamp": [
[
"2019–12–26"
]
],
"loglevel": [
[
"INFO"
]
],
"message": [
[
"You Know for Search"
]
]
}
É gafanhoto, é possível, vem comigo nessa aventura, pode vir.

Vamos lá, explicarei passo a passo:

Antes de explicar alguns termos, vale ressaltar que o GROK funciona como um regex em cima do texto que vocês está tentando processar, ou seja, para cada termo que vier no seu log, ele precisará reconhecer o que é, que tipo de dado se trata e o que deve ser processado ou não.

Exemplo:

[2019–12–26] INFO[2019–12–26] == \[%{DATA:timestamp}\]
INFO == %{WORD:loglevel}

Onde descartamos o ‘[‘ e ‘]’ utilizando um delimitador, criamos um campo na estrutura chamado timestamp que recebe como valor “2019–12–26”, e criamos um outro campo chamado loglevel que recebe o valor “INFO”

Caso queira testar a sua regex pode-se utilizar a aplicação web http://grokdebug.herokuapp.com/ ou na console do seu kibana, indo em “Dev Tools” e depois em “Grok Debugger”.

  • Delimitadores: são definidos por ‘\’ e são utilizados antes de um caractere especial.
  • Sintaxe: Nome do padrão utilizado para reconhecimento de um valor. Como vimos acima, utilizamos a sintaxe WORD para associarmos um datatype similar a “String” na palavra “INFO”. Há uma variedade de sintaxes disponíveis e pode se utilizar o seguinte link para verificar https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns.
  • Semantica: Esse será o identificador utilizado para associar o valor “INFO” a uma “variável” que optamos por chamar de “loglevel”, esse mesmo identificador será nosso campo quando processarmos e indexa-los em um documento no Elasticsearch.

Implementação no logstash:

input {
beats {
port => "5044" }
}
filter {
grok {
match => {
"message" => "\[%{DATA:timestamp}\] %{WORD:loglevel} MensagemdoLOG\: %{GREEDYDATA:logmessage}"
}
}
}
output {
elasticsearch {
index => "logs"
}
}

Obs: Podemos ter mais de um grok regex dentro de um mesmo método match!

Conclusão

Nesse artigo, entendemos de maneira sucinta como funciona a transformação de dados não estruturados de logs em dados estruturados que podem futuramente ter seus valores buscados dentro do Elasticsearch.

Valeu!

--

--

Felipe Queiroz - Tech Lipe

Felipe Queiroz — Data Arch Tech Lead, Embaixador e Certified Engineer da @Elastic e criador do projeto TechLipe