.NET Core中NLog如何捕获非Controller场景的控制器名称并手动设置字段
手动设置NLog的aspnet-mvc-controller和aspnet-mvc-action字段
针对非MVC模式的操作(比如tusdotnet),可以通过以下几种方式手动填充这两个字段:
1. 使用异步安全的上下文(推荐)
利用NLog的MappedDiagnosticsLogicalContext(MDLC),它适配异步Web场景,能自动隔离不同请求的上下文。在tusdotnet的处理逻辑前后添加作用域:
using NLog.MappedDiagnosticsLogicalContext; // 在tusdotnet处理代码的起始处 using (MDLC.SetScoped("aspnet-mvc-controller", "TusUpload")) using (MDLC.SetScoped("aspnet-mvc-action", "HandleFileUpload")) { // 执行tusdotnet的上传逻辑 _logger.LogInformation("文件上传请求正在处理"); }
作用域结束后字段会自动恢复原值,不会干扰其他请求的日志记录。
2. 单条日志直接传入属性
如果仅需给特定日志条目设置字段,可以在调用日志方法时附加自定义属性:
_logger.LogInformation( "文件上传完成", new { aspnet_mvc_controller = "TusUpload", aspnet_mvc_action = "HandleFileUpload" } );
NLog会自动识别这些属性,与原有布局中的{aspnet-mvc-controller}、{aspnet-mvc-action}对应填充。
3. 全局中间件批量处理
如果所有tusdotnet请求都需要统一设置字段,可以添加自定义中间件,根据请求路径匹配后自动注入上下文:
app.Use(async (context, next) => { // 根据实际的tusdotnet路径调整判断条件 if (context.Request.Path.StartsWithSegments("/tus/upload")) { using (MDLC.SetScoped("aspnet-mvc-controller", "TusUpload")) using (MDLC.SetScoped("aspnet-mvc-action", "HandleFileUpload")) { await next(); } } else { await next(); } });
将此中间件放在日志中间件之前,确保上下文在日志记录前已被设置。
内容的提问来源于stack exchange,提问作者Benny Adiwijaya
相关产品推荐
相关产品推荐

