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.