.NET Framework迁移至.NET 6后log4net conversionPattern失效如何解决
故障原因
旧配置使用的%aspnet-request占位符转换器是log4net针对.NET Framework的System.Web请求管道实现的,.NET 6作为ASP.NET Core版本,已经完全移除了System.Web的传统请求上下文体系,原转换器无法获取到当前请求数据,因此不会执行占位符替换,直接把原始模式字符串写入日志。
具体调整步骤
- 安装ASP.NET Core适配的log4net组件
原生log4net核心库不带ASP.NET Core的请求上下文支持,需要先引入适配NuGet包,可直接在项目目录下执行CLI命令安装:dotnet add package Log4Net.AspNetCore - 注册log4net中间件打通请求上下文
修改项目的Program.cs文件,在请求管道最前端注册log4net中间件,确保所有请求进入时上下文就能被log4net捕获:var builder = WebApplication.CreateBuilder(args); // 其他服务注册逻辑... builder.Services.AddLog4Net(); // 注册log4net服务 var app = builder.Build(); app.UseLog4Net(); // 注意要放在UseRouting、MapControllers等业务中间件之前 // 其他中间件配置逻辑... app.Run(); - 替换配置中的占位符前缀
适配组件的请求占位符前缀为%aspnetcore-request,需要把原配置中所有%aspnet-request替换为该前缀,修正后的参数配置示例如下:<parameter> <parameterName value="@username" /> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%aspnetcore-request{AUTH_USER}" /> </layout> </parameter> <parameter> <parameterName value="@ipaddress" /> <dbType value="String" /> <size value="100" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%aspnetcore-request{REMOTE_ADDR}" /> </layout> </parameter> <parameter> <parameterName value="@useragent" /> <dbType value="String" /> <size value="150" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%aspnetcore-request{HTTP_USER_AGENT}" /> </layout> </parameter> <parameter> <parameterName value="@url" /> <dbType value="String" /> <size value="4000" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%aspnetcore-request{URL} %aspnetcore-request{QUERY_STRING}" /> </layout> </parameter> <parameter> <parameterName value="@method" /> <dbType value="String" /> <size value="50" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%aspnetcore-request{REQUEST_METHOD}" /> </layout> </parameter> - 特殊场景适配
如果服务部署在反向代理(Nginx、IIS反向代理等)后面,REMOTE_ADDR字段默认会取到代理服务器IP,需要提前在Program.cs中添加转发头中间件配置,才能获取真实客户端IP;如果使用ASP.NET Core Identity做认证,AUTH_USER取值为空时,可以将占位符替换为%aspnetcore-request{HttpContext.User.Identity.Name}获取当前登录用户名。
内容的提问来源于stack exchange,提问作者Zenox
相关产品推荐
相关产品推荐

