Pular para o conteúdo
Código e Café com PauloDev: Explorando o Universo da Programação

Código e Café com PauloDev: Explorando o Universo da Programação

Explore o universo da programação e tecnologia com PauloDev. Descubra insights, tutoriais e inovações que moldam o futuro digital. De linhas de código a ideias revolucionárias, embarque nesta jornada tech onde a paixão pela inovação se encontra com a expertise do desenvolvimento. Seja bem-vindo ao blog que transforma códigos em narrativas de vanguarda, guiado pela visão única de PauloDev no vasto panorama tecnológico.

  • Meu portifolio

Escrevendo Logs na sua aplicação C# com NLog

13 de julho de 2024
Por Paulo In Boas Práticas

Escrevendo Logs na sua aplicação C# com NLog

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.

Promoção
Written by:

Paulo

Ver todos os posts

Categorias

  • Android
  • Android Studio
  • Angular
  • API
  • AWS
  • Back-end
  • Bash
  • Boas Práticas
  • CSharp
  • CSS
  • Django
  • Docker
  • Electron
  • Front-end
  • Git
  • Github
  • Html
  • Http
  • Java
  • JavaScript
  • Laravel
  • Linha de comando
  • Linux
  • Machine Learning
  • Metodologias
  • Mysql
  • Node
  • NoSql
  • PHP
  • Power Shell
  • Python
  • Segurança
  • Sem categoria
  • SQL
  • Tecnologia
  • Testes
  • VueJs
  • Windows

Últimos posts

  • Python para o desenvolvimento Web: Como o Django pode alavancar na escrita do seu código
  • Conheça as Transactions e como elas podem te ajudar a testar o seu sistema
  • Melhorando a performance dos seus projetos PHP, conheça o OPCache e o JIT
  • Redis com Laravel: Uma ferramenta poderosa para o escalonamento horizontal da sua aplicação
  • Conhecendo e configurando um servidor de Load Balance com YARP e NGINX

© Todos os direitos reservados PauloDev 2023