You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 04:39:19