Pular para conteúdo

Logs

Sistema de logging estruturado do TepConfina com Serilog.

Visao Geral

O TepConfina utiliza Serilog para logging estruturado, facilitando a busca e analise de logs em todos os ambientes.

flowchart LR
    A[Aplicacao] --> B[Serilog]
    B --> C[Console Sink]
    B --> D[File Sink]
    B --> E[CloudWatch Logs]

Configuracao

Program.cs

builder.Host.UseSerilog((context, config) =>
{
    config
        .ReadFrom.Configuration(context.Configuration)
        .Enrich.FromLogContext()
        .Enrich.WithMachineName()
        .Enrich.WithEnvironmentName()
        .WriteTo.Console(new JsonFormatter())
        .WriteTo.File(
            path: "logs/tepconfina-.log",
            rollingInterval: RollingInterval.Day,
            retainedFileCountLimit: 30);
});

// Request logging middleware
app.UseSerilogRequestLogging(options =>
{
    options.EnrichDiagnosticContext = (diagnosticContext, httpContext) =>
    {
        diagnosticContext.Set("UserId",
            httpContext.User.FindFirst("sub")?.Value ?? "anonymous");
        diagnosticContext.Set("TenantId",
            httpContext.User.FindFirst("tenantId")?.Value ?? "none");
    };
});

Niveis de Log

Nivel Uso Exemplo
Debug Detalhes de desenvolvimento Query SQL executada
Information Operacoes normais do sistema Lote criado, usuario logou
Warning Situacoes inesperadas nao criticas Rate limit atingido, token expirado
Error Erros que impactam funcionalidade Falha ao salvar no banco
Fatal Erros criticos que impedem funcionamento Banco de dados indisponivel

Configuracao por Categoria

{
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft.AspNetCore": "Warning",
        "Microsoft.EntityFrameworkCore": "Warning",
        "System.Net.Http.HttpClient": "Warning"
      }
    }
  }
}

Override de categorias

Categorias do framework (ASP.NET Core, EF Core) sao configuradas com nivel Warning para reduzir ruido nos logs. Em desenvolvimento, altere para Debug quando necessario.

Formato Estruturado

Cada entrada de log e emitida em formato JSON estruturado:

{
  "Timestamp": "2026-03-07T14:30:22.123Z",
  "Level": "Information",
  "MessageTemplate": "Lote {LoteId} criado por {UserId}",
  "Properties": {
    "LoteId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "UserId": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
    "TenantId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "MachineName": "tepconfina-api-task-1",
    "Environment": "Production",
    "TraceId": "abcdef1234567890",
    "SpanId": "1234567890abcdef"
  }
}

Request Logging

O middleware UseSerilogRequestLogging registra automaticamente cada requisicao HTTP:

{
  "Timestamp": "2026-03-07T14:30:22.456Z",
  "Level": "Information",
  "MessageTemplate": "HTTP {RequestMethod} {RequestPath} responded {StatusCode} in {Elapsed:0.0000}ms",
  "Properties": {
    "RequestMethod": "GET",
    "RequestPath": "/api/lotes",
    "StatusCode": 200,
    "Elapsed": 45.2341,
    "UserId": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
    "TenantId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
  }
}

Informacoes Registradas

Campo Descricao
RequestMethod Metodo HTTP (GET, POST, PUT, DELETE)
RequestPath Caminho da requisicao
StatusCode Codigo de resposta HTTP
Elapsed Tempo de processamento em ms
UserId ID do usuario autenticado
TenantId ID do tenant do usuario

Correlation IDs

Cada requisicao carrega um TraceId que permite rastrear todas as operacoes relacionadas:

// O TraceId e automaticamente propagado pelo OpenTelemetry
// e incluso em todos os logs da requisicao

_logger.LogInformation(
    "Processando lote {LoteId} - TraceId: {TraceId}",
    loteId,
    Activity.Current?.TraceId.ToString());

Rastreamento de problemas

Use o TraceId para filtrar todos os logs de uma requisicao especifica. Isso facilita o debug de problemas em producao.

Sinks por Ambiente

Ambiente Console File CloudWatch
Development Sim Sim Nao
Staging Sim Nao Sim
Production Sim Nao Sim

Retencao de Logs

Ambiente Retencao Armazenamento
Development 30 dias Arquivo local
Staging 30 dias CloudWatch Logs
Production 90 dias CloudWatch Logs

Boas Praticas

Dados sensiveis

Nunca logue dados sensiveis como senhas, tokens JWT completos, CPFs ou dados financeiros. Use mascaramento quando necessario.

  • Use logging estruturado com templates: _logger.LogInformation("Lote {LoteId} criado", loteId)
  • Evite interpolacao de string: _logger.LogInformation($"Lote {loteId} criado") (anti-pattern)
  • Inclua contexto relevante nas mensagens (IDs, acoes)
  • Use o nivel adequado para cada situacao
  • Mantenha mensagens concisas e descritivas