首页 > 解决方案 > ASP.NET Core 5 API 属性中的通用日志记录

问题描述

我正在使用 ASP.NET Core 5 实现 API,并使用属性添加了响应缓存。现在我想将日志记录添加到此属性以进行调试和跟踪。

所以我的代码看起来像这样

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class CachedAttribute : Attribute, IAsyncActionFilter
{
    private readonly int _timeToLiveSeconds;

    public CachedAttribute(int timeToLiveSeconds)
    {
        _timeToLiveSeconds = timeToLiveSeconds;
    }

    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        //Get cache setting, check if enabled
        //get cache & logger services
        var cacheService = context.HttpContext.RequestServices.GetRequiredService<IResponseCacheService>();

        var loggerService = context.HttpContext.RequestServices.GetRequiredService<ILogger<ProductController>>();

        loggerService.LogDebug("Debug message");
        //Do work here
        loggerService.LogTrace("tracing message");

        //Do more work here
    }
}

这工作正常,没问题。

现在我希望在多个控制器中重用这个属性。所以我需要把这条线改成更通用

var loggerService = context.HttpContext.RequestServices.GetRequiredService<ILogger<ProductController>>();

所以我尝试从 更改ProductControllerControllerBase,

var loggerService = context.HttpContext.RequestServices.GetRequiredService<ILogger<ControllerBase>>();

但这不起作用!我根本没有收到任何错误,但也没有生成日志记录。

那么如何使这种日志记录更通用以与不同的控制器一起使用?

我正在使用 SeriLog,如果这有什么不同的话。

标签: c#asp.net-core

解决方案


根据 Ihusaan Ahmed 的评论,我能够按以下方式解决它

var loggerFactory = context.HttpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var loggerService = loggerFactory.CreateLogger(context.Controller.GetType());

然后正常使用

 loggerService.LogDebug("Debug message");
 //Do work here
 loggerService.LogTrace("tracing message");

推荐阅读