.NET Core 6中如何实现API进入与退出时的日志记录?
.NET Core 6 中实现 DelegatingHandler 记录 API 进出日志
步骤1:修正并完善日志处理器类
你的代码存在类名与构造函数名不一致的问题,同时.NET Core更推荐用依赖注入管理实例而非直接在构造函数中初始化。调整后的处理器类如下:
public class LoggingHandler : DelegatingHandler { private readonly ApiLog _logIn; private readonly ApiLog _logOut; // 通过构造函数注入依赖,符合.NET Core依赖注入规范 public LoggingHandler(ApiLog logIn, ApiLog logOut) { _logIn = logIn; _logOut = logOut; } protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { // 记录进入API的请求日志 _logIn.AddIncomingLog(request); // 调用后续处理器或控制器逻辑 HttpResponseMessage response = await base.SendAsync(request, cancellationToken); // 记录API返回的响应日志 if (response.Content != null) { _logOut.AddOutgoingLog(response); } return response; } }
如果ApiLog需要连接字符串和日志类型参数,应在DI容器注册时传入,而非在处理器中硬编码实例化:
// 在Program.cs中注册ApiLog builder.Services.AddScoped<ApiLog>(sp => new ApiLog( builder.Configuration.GetConnectionString("YourDbConn"), "ApiRequestResponse" ) );
步骤2:将处理器注册到管道
根据你的使用场景,分两种情况注册:
场景1:拦截当前Web API的请求/响应
将处理器注册为服务并添加到控制器过滤器管道:
// 注册LoggingHandler为瞬时服务 builder.Services.AddTransient<LoggingHandler>(); // 配置控制器,添加自定义处理器 builder.Services.AddControllers(options => { options.Filters.Add<LoggingHandler>(); });
场景2:用于调用外部API的HttpClient
将处理器添加到HttpClient的消息处理管道:
builder.Services.AddHttpClient("ExternalApiClient") .AddHttpMessageHandler<LoggingHandler>();
注意事项
- 如果
AddIncomingLog和AddOutgoingLog是同步方法,建议改为异步实现,避免阻塞请求线程 - 日志中要过滤敏感信息(如令牌、密码),防止数据泄露
- 依赖注入方式更便于后续的单元测试和配置修改
内容的提问来源于stack exchange,提问作者Newbie_thefirst
相关产品推荐
相关产品推荐

