实现一个新的.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的新手,如果有任何建议,我将不胜感激。
1条答案
按热度按时间qyzbxkaa1#
当使用依赖注入时,你需要在你的构造函数中注入一个具体的
ILogger<T>
,比如ILogger<ExceptionFilterAttribute>
。从文档中
要创建日志,请使用依赖注入(DI)中的
ILogger<TCategoryName>
对象。ASP.NET Core Web应用程序使用
ILogger<T>
自动获取使用完全限定类型名称T
作为类别的ILogger
示例。您的代码将看起来像下面这样。