Tenho utilizado Microsoft.Extensions.Logging
para minha implementação de log de projeto de API da Web do ASP.NET Core 8 e recentemente decidi mudar para o Serilog. O processo de migração foi bem-sucedido, exceto no aspecto de atualização do recurso 'BeginScope' do Microsoft.Extensions.Logging
.
Ao tentar atualizar, estou encontrando uma mensagem de erro que afirma:
'ILogger' não contém uma definição para 'BeginScope' e nenhum método de extensão acessível 'BeginScope' aceitando um primeiro argumento do tipo 'ILogger' foi encontrado.
Tentei solucionar o problema sozinho, mas não consegui encontrar uma solução até agora. Espero que alguém aqui possa esclarecer o que pode estar causando esse erro e como resolvê-lo.
Qualquer orientação sobre como atualizar corretamente o recurso 'BeginScope' ao migrar de Microsoft.Extensions.Logging para Serilog em um projeto de API Web ASP.NET Core 8 seria muito apreciada.
Código
using Microsoft.AspNetCore.Diagnostics;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Hosting;
using Serilog;
using Demo.Exceptions;
using Demo.GuardClauses;
namespace Demo.Middlewares;
internal class GlobalExceptionHandler(ILogger logger, IWebHostEnvironment env) : IExceptionHandler
{
private readonly ILogger _logger = logger.ForContext<GlobalExceptionHandler>();
private readonly IWebHostEnvironment _env = env.IsNotNull();
public async ValueTask<bool> TryHandleAsync(HttpContext httpContext, Exception exception, CancellationToken cancellationToken)
{
var errorResult = exception switch
{
FluentValidation.ValidationException fluentException => ExceptionDetails.HandleFluentValidationException(fluentException),
UnauthorizedException unauthorizedException => ExceptionDetails.HandleUnauthorizedException(unauthorizedException),
ForbiddenException forbiddenException => ExceptionDetails.HandleForbiddenException(forbiddenException),
NotFoundException notFoundException => ExceptionDetails.HandleNotFoundException(notFoundException),
TimeOutException timeOutException => ExceptionDetails.HandleTimeOutException(timeOutException),
_ => ExceptionDetails.HandleDefaultException(exception),
};
var errorLogLevel = exception switch
{
FluentValidation.ValidationException or UnauthorizedException => LogEventLevel.Warning,
_ => LogEventLevel.Error
};
LogErrorMessage(errorLogLevel, exception, errorResult);
var response = httpContext.Response;
if (!response.HasStarted)
{
response.ContentType = "application/problem+json";
response.StatusCode = errorResult.Status!.Value;
await response.WriteAsJsonAsync(errorResult, cancellationToken).ConfigureAwait(false);
}
else
{
_logger.Warning("Can't write error response. Response has already started.");
}
return true;
}
private void LogErrorMessage1(LogEventLevel errorLogLevel, Exception exception, ExceptionDetails details)
{
var properties = new Dictionary<string, object>
{
{
"TraceId",
details.TraceId
}
};
if (details.Errors != null)
{
properties.Add("Errors", details.Errors);
}
if (_env.IsDevelopment())
{
properties.Add("StackTrace", exception.StackTrace!.Trim());
}
using (_logger.BeginScope(properties))
{
_logger.Write(errorLogLevel, "{title} | {details} | {traceId}", details.Title, details.Detail, details.TraceId);
}
}
}
Alguém pode me ajudar aqui, fornecendo orientação? Qualquer ajuda seria muito apreciada.
O recurso análogo específico do Serilog é
LogContext
:Você precisa habilitá-lo na configuração:
E use
LogContext.PushProperty
: