c# - 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>>();
所以我尝试从 更改ProductController
为ControllerBase
,
var loggerService = context.HttpContext.RequestServices.GetRequiredService<ILogger<ControllerBase>>();
但这不起作用!我根本没有收到任何错误,但也没有生成日志记录。
那么如何使这种日志记录更通用以与不同的控制器一起使用?
我正在使用 SeriLog,如果这有什么不同的话。
解决方案
根据 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");
推荐阅读
- server - 如何限制 tensorflow_model_server 一次处理一个请求?处理多个请求会导致它崩溃
- docker - 为不同的项目使用单个 nginx
- java - Weblogic 控制台获取任何用户的当前密码
- c# - 从 servicenow 公开的 SOAP 的 NULL 响应以获取事件编号详细信息?
- git - 由于冲突解决不当,将分支重新合并到主分支
- javascript - 如何在 google 和 API 的操作中使用 async 和 await
- pyspark - IllegalArgumentException:'字段“标签”不存在。在 PYSPARK
- django - 我有 django rest_framework ListAPIView 方法,它返回用户列表,我如何从同一个用户列表中排除请求用户
- orchardcms - 覆盖 Orchard 中的密码格式
- polymer - Polymer 3 - KeyframeEffect 未定义