Imagine você, um programador freelancer que acaba de publicar o projeto do seu cliente. Meses depois, esse mesmo cliente te liga informando um problema na hora do cadastro, e que não sabe como ocorreu. Você, por sua vez, começa a acessar os arquivos do seu sistema, e verificar arquivo por arquivo já que não lembra mais do código, e a descrição do seu cliente não te ajuda a encontrar a origem do problema.
Para isso existem os logs, arquivos gerados por um sistema que contém informações sobre as operações, atividades e outras informações da aplicação, servidor e/ou sistema. Nos logs, geralmente, temos uma descrição de uma ação junto do horário que ele foi executado, e isso, por sua vez, nos auxilia a encontrar um determinado erro, ou fazer revisões no funcionamento do nosso código.
Tipos de Logs
Dentro do seu funcionamento, temos algumas classificações que nos auxiliam a escrever nossos logs. Essas classificações, por sua vez, nos ajudam a saber o que iremos encontrar no nosso log ou o que devemos passar para escrevê-lo. Existem vários, mas os principais são:
- Logs de eventos: Um log de evento é um log de alto nível que registra dados das atividades do sistema, a fim de fornecer uma trilha de auditoria para solucionar problemas. Logs de eventos são essenciais para entender o comportamento de sistemas complexos, principalmente no caso de aplicações com pouca interação do usuário. Por exemplo, nas redes, os logs de eventos registram o tráfego, o acesso e o uso da rede.
- Logs do sistema: Um log do sistema registra os eventos do sistema operacional, como alterações no sistema, mensagens da inicialização, erros, alertas e desligamentos inesperados.
- Logs de acesso: Um log de acesso registra a lista de todas as solicitações de arquivos individuais que as pessoas ou aplicações solicitam de um sistema. Ele inclui informações sobre a autenticação do usuário, quem solicitou um arquivo específico do sistema, quando a solicitação foi feita e outras informações associadas.
- Logs do servidor: Um log do servidor é um arquivo de log que um servidor cria e mantém automaticamente. Ele contém a lista de atividades que o servidor executa, como o número de solicitações de páginas, endereços IP do cliente, tipos de solicitações e etc.
- Logs de alterações: Um log de alterações é um arquivo que contém um registro cronológico das alterações feitas no software. Por exemplo, ele poderá registrar alterações entre diferentes versões de uma aplicação ou alterações na configuração de um sistema.
O NLog
Nlog é uma biblioteca de registro de logs muito flexível e gratuita, que nos permite escrever logs em diversos tipos de projeto .NET, incluindo o .NET Standard. O NLog, facilita a gravação em vários alvos (banco de dados, arquivos, console) e a alteração da configuração em tempo real.
Algumas das principais características do NLog são:
- Fácil de configurar: O NLog é muito fácil de configurar, tanto por meio de arquivo de configuração quanto programaticamente . Mesmo sem reiniciar o aplicativo, a configuração pode ser alterada.
- Modelável: Cada mensagem de log pode ser modelada com vários layouts de renderização
- Extensível: O NLog já inclui vários alvos e layouts predefinidos, mas você também pode estender com seus próprios alvos e layouts personalizados ou incluir seus próprios valores de contexto personalizados
- Registro estruturado: Suporte total para registro estruturado e manipular modelos de mensagem e propriedades de logevent personalizadas.
- Registro de extensão da Microsoft: O NLog pode ser totalmente integrado ao Microsoft Extensible Logging (e ASP.NET Core), sem precisar substituir o Microsoft LoggerFactory padrão. O NLog captura automaticamente as propriedades LogEvent e pode usá-las na saída de destino do log estruturado.
- Configurações de aplicativo.json: A configuração do NLog pode ser carregada de appsettings.json como uma alternativa ao arquivo XML NLog.config . Também é possível configurar alvos NLog usando valores de appsettings.json com ${configsetting}
Um pouco de prática – Implementando o NLog no seu código
Vamos dar uma pequena passada em como fazer a integração do NLog em uma API em ASP.NET CORE. Mas, não se limite a isso, sinta-se à vontade para dar uma verificada na documentação oficial.
Vamos iniciar criando uma arquivo de configuração no nosso projeto (tendo em vista que você já instalou o pacote do NLog), o nlog.conf, arquivo responsável por definir as diversas configurações que o NLog nos oferece, por exemplo, onde serão armazenados nossos logs:
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true"
internalLogLevel="Info"
internalLogFile="c:\temp\internal-nlog-AspNetCore.txt">
<!-- enable asp.net core layout renderers -->
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions>
<!-- the targets to write to -->
<targets>
<!-- File Target for all log messages with basic details -->
<target xsi:type="File" name="allfile" fileName="c:\temp\nlog-AspNetCore-all-${shortdate}.log"
layout="${longdate}|${event-properties:item=EventId:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}" />
<!-- File Target for own log messages with extra web details using some ASP.NET core renderers -->
<target xsi:type="File" name="ownFile-web" fileName="c:\temp\nlog-AspNetCore-own-${shortdate}.log"
layout="${longdate}|${event-properties:item=EventId:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
<!--Console Target for hosting lifetime messages to improve Docker / Visual Studio startup detection -->
<target xsi:type="Console" name="lifetimeConsole" layout="${MicrosoftConsoleLayout}" />
</targets>
<!-- rules to map from logger name to target -->
<rules>
<!--All logs, including from Microsoft-->
<logger name="*" minlevel="Trace" writeTo="allfile" />
<!--Output hosting lifetime messages to console target for faster startup detection -->
<logger name="Microsoft.Hosting.Lifetime" minlevel="Info" writeTo="lifetimeConsole, ownFile-web" final="true" />
<!--Skip non-critical Microsoft logs and so log only own logs (BlackHole) -->
<logger name="Microsoft.*" maxlevel="Info" final="true" />
<logger name="System.Net.Http.*" maxlevel="Info" final="true" />
<logger name="*" minlevel="Trace" writeTo="ownFile-web" />
</rules>
</nlog>
Agora, vamos configurar nosso Program.cs para ativar os logs:
using NLog;
using NLog.Web;
// Early init of NLog to allow startup and exception logging, before host is built
var logger = NLog.LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger();
logger.Debug("init main");
try
{
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllersWithViews();
// NLog: Setup NLog for Dependency injection
builder.Logging.ClearProviders();
builder.Host.UseNLog();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
}
catch (Exception exception)
{
// NLog: catch setup errors
logger.Error(exception, "Stopped program because of exception");
throw;
}
finally
{
// Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux)
NLog.LogManager.Shutdown();
}
Por fim, basta usarmos no nosso projeto:
using Microsoft.Extensions.Logging;
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
_logger.LogDebug(1, "NLog injected into HomeController");
}
public IActionResult Index()
{
_logger.LogInformation("Hello, this is the index!");
return View();
}
}
Conclusão
Como dito, esse é apenas um pequeno exemplo do uso do NLog, mas como toda ferramenta, ele não se limita a isso. Por isso, recomendo você dar uma olhada na documentação oficial do NLog. Garanto que você vai achar o que procura.