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

.NET 6 Web API中ConfigureServices写NLog日志致请求属性丢失

在.NET 6 Web API的ConfigureServices中使用NLog日志且避免请求属性丢失的解决方案

问题根源

直接通过LogManager.GetCurrentClassLogger()或过早调用services.BuildServiceProvider()获取Logger,会导致NLog的ASP.NET核心集成未完成初始化就创建了Logger实例,破坏了NLog与请求上下文的关联机制,进而导致后续所有请求的${aspnet-request-url}、${aspnet-mvc-action}等布局渲染器无法正确获取请求信息。

正确实现步骤

  1. 确保依赖正确
    已安装NLog.Web.AspNetCore NuGet包,这是NLog与ASP.NET Core集成的核心包。

  2. 优先通过Host集成NLog
    在Program.cs中,先通过Host.UseNLog()完成NLog与ASP.NET Core的绑定,而不是手动创建Logger实例。这一步会自动注册NLog所需的服务和上下文关联逻辑。

  3. 安全在ConfigureServices中记录日志
    如果必须在ConfigureServices阶段写入日志,要确保在Host.UseNLog()之后再获取Logger,且通过DI容器的正确方式获取:

    var builder = WebApplication.CreateBuilder(args);
    
    // 清除默认日志提供器,配置NLog为日志提供器
    builder.Logging.ClearProviders();
    builder.Logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
    // 关键:先完成NLog与Host的集成
    builder.Host.UseNLog();
    
    // 注册控制器服务
    builder.Services.AddControllers();
    
    // 安全获取Logger(仅在必要时使用,不推荐频繁BuildServiceProvider)
    using var sp = builder.Services.BuildServiceProvider();
    var logger = sp.GetRequiredService<ILogger<Program>>();
    logger.LogInformation("ConfigureServices阶段:服务注册完成");
    
    var app = builder.Build();
    
    // ... 后续中间件配置
    app.Run();
    
  4. 更推荐的方式:将日志操作移至Configure阶段
    Configure阶段已经完成了所有服务初始化和中间件管道配置,此时获取Logger不会干扰后续请求的上下文关联,是最稳妥的选择:

    var app = builder.Build();
    
    // Configure阶段获取Logger
    var logger = app.Services.GetRequiredService<ILogger<Program>>();
    logger.LogInformation("Configure阶段:中间件管道开始配置");
    
    app.UseHttpsRedirection();
    app.UseAuthorization();
    app.MapControllers();
    
    app.Run();
    

关键注意事项

  • 禁止在Host.UseNLog()之前创建任何NLog Logger实例,包括LogManager.GetCurrentClassLogger(),这会导致NLog的ASP.NET集成逻辑失效。
  • 尽量避免在ConfigureServices中调用BuildServiceProvider(),除非必要,因为这会创建额外的服务容器实例,可能导致服务生命周期问题。

内容的提问来源于stack exchange,提问作者banana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:38:14