Back-End

9 mai, 2018

Utilizando Log em ASP .NET Core

Publicidade

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.

Criação da WebApi
Estrutura da WebApi

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.

Configuração do Log na Aplicação

Edite o arquivo Program.cs, e altere o método Main().

Alteração do método Main()

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

Injeção da interface do ILogger

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

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

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.

Configurar um novo contexto de Log

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

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.

Sobrescrevendo o método de criar Log

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

Criei uma entidade LogEvento, para ser de model da tabela

Entidade LogEvento

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.

Adicionando um novo contexto para o Log

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

Executando a API pelo Postman

 

Controller da API

 

Log incluído na tabela

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: