.net 无法解析IResourceAttribute中访问Serilog ILogger时的服务,ExceptionFilterAttribute

y4ekin9u  于 2023-03-24  发布在  .NET
关注(0)|答案(1)|浏览(139)

实现一个新的.NET 6 Web API,我添加了SeriLog,希望通过自定义ExceptionFilterAttribute和一般的HTTPContext进入/退出事件日志记录来处理异常,但当调用API时,我收到一个错误。
我通过Program.cs添加了Serilog,如下所示:

var logger = new LoggerConfiguration()
        .ReadFrom.Configuration(builder.Configuration)
        .Enrich.FromLogContext()
        .CreateLogger();
builder.Logging.ClearProviders();
builder.Logging.AddSerilog(logger);

通过控制器中的ILogger.LogInformation进行日志记录是很好的,但是当我尝试从一个Attribute或IResourceAttribute的实现中使用ILogger时,它抛出了一个依赖注入异常。
也就是说,当我向Program.cs引入一些使用ILogger的属性时:

builder.Services.AddControllers(options =>
{ 
    options.Filters.Add<MyErrorHandlingAttribute>();
});

Attribute类如下所示:

public class MyErrorHandlingAttribute: ExceptionFilterAttribute
    {
        private readonly ILogger _logger;
        public MyErrorHandlingAttribute(ILogger logger)
        {
            _logger= logger?? throw new ArgumentNullException(nameof(logger));
        }
    }

例外情况:
系统操作无效异常:在尝试激活“MessageOrchestrator.Common.Attributes. MyErrorHandlingAttribute”时无法解析类型“Microsoft.Extensions. Logging.ILogger”的服务。
在Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp,Type type,Type requiredBy,Boolean isDefaultParameterRequired)
在lambda_方法2(Closure,IServiceProvider,Object[])位于Microsoft.AspNetCore.Mvc.TypeFilterAttribute.CreateInstance(IServiceProvider服务提供程序).AspNetCore.Mvc.筛选器.默认筛选器提供程序.提供筛选器(FilterProviderContext上下文,FilterItem filterItem),位于Microsoft.AspNetCore.Mvc.Filters.DefaultFilterProvider.OnProvidersExecuting(FilterProviderContext上下文),位于Microsoft.AspNetCore.Mvc.Filters.FilterFactory.CreateUncachedFiltersCore(IFilterProvider[] filterProviders,ActionContext actionContext,List`1 filterItems)
在Microsoft.AspNetCore.Mvc.Filters.FilterFactory.GetAllFilters(IFilterProvider[] filterProviders,ActionContext actionContext)位于Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvokerCache.GetCachedResult(ControllerContext controllerContext)位于Microsoft.AspNetCore.Mvc.Routing.ControllerRequestDelegateFactory.〈〉c__DisplayClass12_0.b__0(HttpContext上下文),位于Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext httpContext)---从上一个位置开始的堆栈跟踪结束---在Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext上下文),位于Swashbuckle.AspNetCore.SwaggerUI. SwaggerUI中间件.调用(HttpContext httpContext)at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext,ISwaggerProvider swaggerProvider)at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
对不起,我是SeriLog的新手,如果有任何建议,我将不胜感激。

qyzbxkaa

qyzbxkaa1#

当使用依赖注入时,你需要在你的构造函数中注入一个具体的ILogger<T>,比如ILogger<ExceptionFilterAttribute>
从文档中
要创建日志,请使用依赖注入(DI)中的ILogger<TCategoryName>对象。
ASP.NET Core Web应用程序使用ILogger<T>自动获取使用完全限定类型名称T作为类别的ILogger示例。
您的代码将看起来像下面这样。

public class MyErrorHandlingAttribute: ExceptionFilterAttribute
{
    private readonly ILogger _logger;
    public MyErrorHandlingAttribute(ILogger<ExceptionFilterAttribute> logger)
    {
        _logger= logger ?? throw new ArgumentNullException(nameof(logger));
    }
}

相关问题