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 artigo 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 logar via console do Visual Studio:
Pelo Visual Studio vamos criar uma WebApi em ASP .NET Core.
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.
Edite o arquivo Program.cs, e altere o método Main().
Vamos criar uma nova controller para API chamada Cidade, e vamos injetar o ILogger no construtor da controller.
Adicionei um método GET na API, e vou logar como informação o Id que está sendo passado ao método.
Ao executar o método na API, o Log é executado no console do Visual Studio em tempo de depuração:
Observação: O ILogger tem várias categorias além do Information, sendo:
- Error
- Critical
- Trace
- Warning
- Debug
Ótimo, mas além de 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 essa estrutura na solução:
Extensão para Logger
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.
Depois, temos que sobrescrever o método de Log, herdando do ILoggerProvider. Essa implementação está na classe AppLoggerProvider.
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 e herdando de ILogger. Essa implementação está na classe AppLogger.
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:
Criei uma entidade LogEvento, para ser de model da tabela
Na classe RepositorioLogger existe um método para executar o comando no banco.
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.
Enfim, rodando a aplicação e executando a API, o Log é inserido na tabela EventLog.
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: