Centralizando Logs com ASP.NET Core, ElasticSearch, Kibana e Docker

Um guia de como gravar logs com uma API ASP.NET Core no ambiente Docker com ElasticSearch e Kibana.

Requisitos

Para o projeto iremos  precisar dos seguintes requisitos:

  • Visual Studio
  • .NET Core SDK 3.1
  • Docker
  • Postman para testar ou qualquer outra ferramenta semelhante.

Subindo o ElasticSearch e o Kibana no Docker

Primeiro iremos rodar o ElasticSearch e o Kibana em um container Docker. Para isto, será necessário criar um arquivo docker-compose.yml com as configurações do ambiente.

Execute as seguintes configurações nele:

  • Nome do container
  • Informe as imagens do ElasticSearch e Kibana que serão baixadas do Docker Registry
  • As portas em que as aplicações irão rodar
  • Configurações de ambiente de cada aplicação

Figura 1 docker-compose.yml

Após isto, utilize o comando para executar o arquivo e criar os containers.

docker-compose up -d

Quando ela finalizar, você terá o Elastic e o Kibana rodando nas portas configuradas. Então, realize uma verificação para confirmar se está tudo certo antes de seguirmos para o próximo passo.

Figura 2 Lista de containers do Docker

 

Verificando o ElasticSearch

Acesse a URL configurada para o ElasticSearch: http://localhost:9200

Figura 3 ElasticSearch

 

Verificando o Kibana

Acesse a URL configurada para o Kibana: http://localhost:5601

Figura 4 Kibana

 

Criando a API e gravando os logs no ElasticSearch com Serilog

Agora que já temos o ElasticSearch e o Kibana rodando no Docker, vamos criar a nossa API para receber e gravar os logs.

Primeiro, crie o projeto no Visual Studio, selecione a opção “Create a new project”:

Figura 5 Criar novo projeto

Em seguida selecione o tipo de solução:

Figura 6 Tipo do Projeto

Figura 7 Template do projeto

Agora, adicione os seguintes pacotes nuget da ferramenta Serilog:

  • AspNetCore
  • Enrichers.Enviroment
  • Sinks.Debug
  • Sinks.ElasticSearch

Depois de instalar os pacotes, altere o arquivo appsettings, substitua a seção de log default pela configuração do serilog e também adicione uma seção com os dados do Servidor do ElasticSearch.

Figura 8 Arquivo appsettings.json

No próximo passo, faça as configurações necessárias para o serilog conectar e gravar os logs no Elastic. Utilize as seguintes implementações na classe Program.cs.

Adicione as referências do Serilog na classe.

Figura 9 Referências da classe

 

No método main, configure os logs antes de criar o host da aplicação.

Figura 10 Chamada do ConfigureLogging no método main

Crie os métodos “ConfigureLogging” e “ConfigureElasticSink”.

Figura 11 Método ConfigureLogging

Figura 12 Método ConfigureElasticSink

A propriedade “IndexFormat” configurada na imagem acima, representa o nome do Index Pattern que os logs serão gravados no ElasticSearch, vamos consultar os dados no Kibana através desse index.

Por último, implemente no método “CreateHostBuilder” a utilização do serilog no momento de criação do Host.

Figura 13 Método CreateHostBuilder

Em seguida, crie uma classe de contrato (LoggerRequest) com as seguintes propriedades referentes à aplicação cliente da nossa API:

  • ApplicationName: Nome da aplicação que está enviando os logs
  • Message: A mensagem que a aplicação está enviando para ser gravada
  • InnerMessage: No caso de um erro, permite o envio de uma mensagem complementar à mensagem de erro principal
  • Stacktrace: Para identificar onde ocorreu o erro

Figura 14 Classe contrato LoggerRequest

Agora, vamos implementar um serviço (LoggerService) e a sua interface (ILoggerService) que serão responsáveis por enviar os logs ao ElasticSearch.

Figura 15 Interface ILoggerService

Figura 16 Classe LoggerService

Na classe LoggerService, implementamos 3 métodos responsáveis por cada tipo de log (Informational, Warning e Error). Os métodos recebem como parâmetro o objeto LoggerRequest enviado pela aplicação cliente, com as suas propriedades propriamente preenchidas.

Essa classe fica responsável por adicionar as propriedades no contexto do log e enviá-las para o ElasticSearch.

E agora, por último, vamos criar a nossa controller (LoggerController) com os 3 endpoints que irão receber os logs.

Figura 17 LoggerController

Feito isso, rode a aplicação para realizar uma requisição na API utilizando o Postman.

Monte o seguinte request no postman e clique em Send para enviar para a API.

Figura 18 Request no Postman

Feito isso, se tudo ocorreu bem, os dados estarão salvos no ElasticSearch e o próximo passo, é configurar o Kibana para exibir os dados do Index Pattern que configuramos na API.

Configurando o Kibana e criando visualizações

Agora configure o Kibana, acesse a URL configurada no browser, que irá abrir o portal.

Figura 19 Kibana

Através do menu lateral, acesse a opção “Stack Management” e depois a opção “Index Pattern”, nessa página realize a configuração do Index Patterns.

Figura 20 Menu lateral

Em seguida, clique na opção “Create index pattern” e digite o nome do Index Pattern que foi configurado na API (centralizador-logs*), conforme for digitando na barra de pesquisa a ferramenta já identifica o Index se encontrar algum com o nome compatível.

Figura 21 Criação do Index Pattern

 

Em seguida clique para avançar, na tela seguinte selecione no campo “Time field” a opção “Timestamp”, feito isso clique para criar o Index.

Agora, navegue no menu lateral para a opção “Discover” e já poderemos ver os logs salvos.

Figura 22 Menu lateral Discover

Feito isso, os seus logs já estão sendo gravados no Elastic e sendo visualizados no Kibana. Para finalizar, crie uma visualização mais amigável dos logs salvos.

Criando um Dashboard dos logs

Para isso, acesse a opção “Dashboard” no menu lateral e clique em “Create dashboard”, nessa página podemos criar diversas formas de visualizações customizadas dos logs.

Figura 23 Dashboards

Agora, crie algumas visualizações para o nosso dashboard. Vá na opção “Create new”, feito isso, vai aparecer um popup com os diversos tipos de visualização que podemos montar. Crie um gráfico do tipo “Pie” e outro do tipo “Table” nesse exemplo.

Figura 24 Tipo de visualização

Figura 25 Grafico Pie

Para configurar o gráfico realize os seguintes passos:

  • Clique na opção “Buckets” e selecione “Split Slices”
  • Em seguida, selecione “Terms” no tipo de agregação do gráfico.
  • Agora, selecione a opção “Field” no campo que vamos contabilizar no gráfico. Para esse exemplo vamos utilizar o campo “level.keyword” que representa os tipos de log (Informational, Warning e Error)
  • Feito isso, clique em Update para atualizar a prévia do gráfico
  • Por último, salve.

Se tudo estiver certo, temos o nosso gráfico no Dashboard.

Figura 26 Dashboard com o gráfico

      Adicione mais uma visualização, selecione o tipo “DataTable”.

Figura 27 Datatable

Para configurar o gráfico realize os seguintes passos:

  • Clique na opção “Buckets” e selecione “Split Rows”
  • Em seguida, selecione “Terms” no tipo de agregação do gráfico
  • Agora, selecione a opção “Field” no campo que vamos adicionar em nossa tabela
  • Repita os passos acima para cada campo que deseja adicionar na tabela
  • Feito isso, clique em Update para atualizar a prévia
  • E salve o gráfico

Feito isso, temos o nosso Dashboard finalizado com as duas visualizações que criamos, podendo customizar de diversas formas, criar filtros e etc.