使用MediatR IRequestPreProcessor日志记录遇类型警告的解决方法
修复MediatR请求日志的"Incorrect type is used for contextual logging"警告
问题原因
这个警告源于.NET日志系统的设计规范:ILogger<T>的泛型参数用于标识日志的来源类型,你当前用请求类型TRequest作为泛型参数,不符合上下文日志的设计逻辑——日志应该关联到处理请求的行为类LoggingBehaviour<TRequest>,而非请求本身。
修复方案
将ILogger的泛型参数从TRequest改为LoggingBehaviour<TRequest>,具体修改如下:
修改后的完整代码
public sealed class LoggingBehaviour<TRequest> : IRequestPreProcessor<TRequest> where TRequest : notnull { private readonly ILogger<LoggingBehaviour<TRequest>> _logger; public LoggingBehaviour(ILogger<LoggingBehaviour<TRequest>> logger) { _logger = logger; } public async Task Process(TRequest request, CancellationToken cancellationToken) { var requestName = typeof(TRequest).Name; _logger.LogInformation("Request: {Name} {@Request}", requestName, request); } }
说明
修改后,日志的上下文会标记为LoggingBehaviour<TRequest>(运行时会显示具体请求类型替换后的完整类名),既符合.NET日志的上下文设计规范、消除警告,同时依然能通过requestName和@Request字段记录请求的具体信息,不影响日志的业务价值。
内容的提问来源于stack exchange,提问作者nop
相关产品推荐
相关产品推荐

