Utilizando Log em ASP .NET Core
Tags: dotnet, log, aspnetcore, jundevelopers
Published: 2019-09-27 12:26:29

Olá pessoal, o Asp .NET Core contempla várias funcionalidades nativas que anteriormente precisávamos baixar referências de terceiros como por exemplo:

- Injeção de Dependências (Simple Injector, AutoFac, etc…)
- Log (NLog, elmah.io, e etc…)
… e algumas outras mais…

Neste post vou falar sobre uma delas, que é o Log! Em desenvolvimento de sistemas, precisamos muitas vezes logar a entrada de dados de uma API, ou logar uma exceção para analisar o que pode estar acontecendo dentro de um fluxo do sistema e etc..

O Log do Asp .NET Core, funciona em vários providers:
- Console
- Depurar
- EventLog
- AzureAppServices
- TraceSource
- EventSource

No exemplo abaixo vou mostrar, como se loga via console do Visual Studio:
Pelo Visual Studio vamos criar uma WebApi em Asp .NET Core

######Criação da API
![Alt Text](https://miro.medium.com/max/947/1*sxXgC80t9PSQCfU8QOb1mQ.png)

######Estrutura da API
![Alt Text](https://miro.medium.com/max/333/1*mxayNcRDehsmse6M4mJG1g.png)


Edite o arquivo Startup.cs, adicione o using Microsoft.Extensions.Logging e no método Configure, adicione um novo parâmetro: ILoggerFactory loggerFactory

E adicione no método as configurações de Console e Debug, desta forma o Log vai ser feito pelo Console do Visual Studio em tempo de depuração.

######Alteração do método Main()
![Alt Text](https://miro.medium.com/max/461/1*hnmpvNkKNyv4ef0IQu6R-Q.png)

Vamos criar uma nova controller para API chamada Cidade, e vamos injetar o ILogger no construtor da controller

######Injeção da interface do ILogger
![Alt Text](https://miro.medium.com/max/426/1*DhiE2x1jRgfHJcXAc4PJkw.png)

Adicionei um método GET na API, e vou logar como informação o Id que está sendo passado ao método.

######Log de informação com Id de Evento
![Alt Text](https://miro.medium.com/max/461/1*nfAjVduFZJo4Ef5sLGItgg.png)

Ao executar o método na API, o Log é executado no console do Visual Studio em tempo de depuração:

######Log no console do Visual Studio
![Alt Text](https://miro.medium.com/max/788/1*T9eDy5DjCxzy17SfDYZO8Q.png)

Obs: O ILogger tem várias categorias, além do Information que são:
- Error
- Critical
- Trace
- Warning
- Debug

Ótimo, mas além logar somente em debug não me adianta muita coisa, quero e preciso logar todas as entradas na API, e também logar todas as exceções que possam acontecer na aplicação.
Para isso, temos que criar uma extensão do ILogger e fazer com que o provider salve os dados do log em um banco de dados. Com isso criei esta estrutura na solução:

![Alt Text](https://miro.medium.com/max/237/1*bAi5QEnca8bZPYIIFo8eOg.png)

Para criar a extensão, temos que usar o ILoggerFactory para criar um novo contexto, um novo provider para configurar o Log a ser registrado em um banco de dados.

Essa configuração está na classe AppLoggerExtensions

######Configurar um novo contexto de Log
![Alt Text](https://miro.medium.com/max/809/1*-zj85IeAgzj5sdFUXPcuiQ.png)

Depois temos que sobrescrever o método de Log, herdando do ILoggerProvider
Essa implementação está na classe AppLoggerProvider

######Sobrescrevendo o método de criar Log
![Alt Text](https://miro.medium.com/max/631/1*2VjvqtFVe-eVCVVAZZrOfg.png)

Para depois de fato criar o Log no banco de dados, obtendo as informações que foram colocadas no Log, também sobrescrevendo o método de Log, herdando de ILogger

Essa implementação está na classe AppLogger

######Sobrescrevendo o método de criar Log
![Alt Text](https://miro.medium.com/max/713/1*0lj4f428CvYZY4js9RafVg.png)

Criei também, um repositório para executar o log no banco de dados. 

Para isso, criei uma tabela em meu banco de dados chamada EventLog, com essa estrutura:

######Tabela de Log
![Alt Text](https://miro.medium.com/max/976/1*xN3oFuPrGhu_y8PujJDkbg.png)

Criei uma entidade LogEvento, para ser de model da tabela

######Entidade LogEvento
![Alt Text](https://miro.medium.com/max/348/1*bOXvGx9GTZ-BHMnV3CP0oA.png)

Na classe RepositorioLogger existe um método para executar o comando no banco.

![Alt Text](https://miro.medium.com/max/1030/1*h4OZTSdQ5DttGYwJNIW9Lg.png)

Antes de rodar a API, precisamos adicionar esse novo provider nas configurações da API. Edite o arquivo Startup.cs e adicione o novo contexto, passando a string de conexão de seu banco de dados.

![Alt Text](https://miro.medium.com/max/827/1*TJ7HrpEG0gL48ucv60DYAQ.png)

Enfim, rodando a aplicação e executando a API, o Log é inserido na tabela EventLog.

######Executando a API pelo Postman
![Alt Text](https://miro.medium.com/max/950/1*uqq4dxEseHRypOVx3LUs5Q.png)

Log na tabela do banco de dados, como no exemplo acima tínhamos escrito.

######Controller da API
![Alt Text](https://miro.medium.com/max/618/1*QVkqVH8tu5YVY9gkMgm56w.png)

######Log incluído na tabela
![Alt Text](https://miro.medium.com/max/602/1*d0rG8l1u9HmRGlwjB4ytJw.png)

Fazendo corretamente as configurações, vocês terão controle de Log em sua aplicação de forma fácil e simples, sem depender de Dlls de terceiros ou fazer na mão.

Espero que tenham gostado do artigo e até a próxima!

Segue o fonte de exemplo em meu Github
[Marraia-Log](https://github.com/marraia/ExemploCoreLog)