ASP.NET Core Minimal API中${aspnet-request-posted-body}日志配置无效求助
问题解决:Minimal API中NLog记录请求体与屏蔽指定日志
一、解决${aspnet-request-posted-body}为空的问题
核心原因:中间件顺序错误 + 请求体读取限制
ASP.NET Core中请求体默认仅能读取一次,NLogRequestPostedBodyMiddleware必须在路由映射(app.MapXXX)之前注册,否则请求体已被后续端点读取,中间件无法捕获。同时需确保请求满足:
- 请求方法为POST/PUT/PATCH等带请求体的类型
- 请求
Content-Type为application/json、application/x-www-form-urlencoded等可解析格式
修正后的Program.cs代码
var logger = LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger(); logger.Debug("Init main..."); // NLog: Setup NLog for Dependency injection builder.Logging.ClearProviders(); builder.Logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace); builder.Host.UseNLog(); // 关键:必须在app.MapXXX之前注册NLog请求体中间件 app.UseMiddleware<NLogRequestPostedBodyMiddleware>(); // 你的Minimal API路由映射(示例) app.MapPost("/api/test", (HttpContext context) => { logger.Info("Received request"); return Results.Ok(); }); app.Run();
额外配置检查
- 确认
NLog.Web.AspNetCore版本≥5.1.0,可通过NuGet包管理器查看 - 若需记录大请求体,可在中间件注册时配置最大缓存大小:
app.UseMiddleware<NLogRequestPostedBodyMiddleware>(new NLogRequestPostedBodyOptions { MaxBodySize = 1024 * 1024 }); // 1MB
二、屏蔽Microsoft.Hosting.Lifetime日志
方案1:通过NLog配置直接过滤
在appsettings.json的NLog规则中添加优先匹配的拒绝规则,利用final: true阻止后续规则处理该日志:
"NLog": { "autoReload": true, "throwConfigExceptions": true, "internalLogLevel": "Info", "internalLogFile": "${basedir}/internal-nlog.txt", "targets": { /* 保持原有配置不变 */ }, "rules": [ // 新增:屏蔽Microsoft.Hosting.Lifetime的所有日志 { "logger": "Microsoft.Hosting.Lifetime", "minLevel": "Trace", "final": true, "writeTo": "" }, // 原有规则 { "logger": "*", "minLevel": "Info", "writeTo": "reqlogfile" }, { "logger": "*", "minLevel": "Info", "writeTo": "reqlogconsole" } ] }
方案2:通过Logging配置过滤
在appsettings.json的Logging节点中直接设置该日志类别为None:
"Logging": { "LogLevel": { "Default": "Information", "Microsoft.Hosting.Lifetime": "None" } }
内容的提问来源于stack exchange,提问作者frozzen10
相关产品推荐
相关产品推荐

