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

ASP.NET MVC中NLog依赖注入日志类标识错误问题求助

问题描述

基于.NET 4.8.1的ASP.NET MVC项目,使用Unity容器依赖注入集成NLog时,不同控制器通过构造函数注入ILogger后,日志输出的${logger}字段始终显示第一个请求注入的控制器名称(如SomeSite.Controllers.SomeController),而非实际产生日志的控制器(如SomeController1)。

成因分析

Unity.NLog扩展默认将ILogger以单例模式注册到容器中。当第一个控制器(SomeController)首次请求注入ILogger时,扩展会基于该控制器的类型创建对应的NLog Logger实例并缓存为单例。后续其他控制器请求注入ILogger时,容器直接复用这个已缓存的单例实例,导致所有日志的${logger}字段都显示第一个控制器的名称。

修复方案

移除Unity.NLog扩展的自动注册逻辑,手动注册ILogger的工厂方法,让容器在每次注入时根据目标控制器的类型创建对应的Logger实例:

修改App_Start/UnityConfig.cs文件:

using System.Web.Mvc;
using Unity;
using Unity.Mvc5;
using NLog;

namespace SomeSite
{
    public static class UnityConfig
    {
        public static void RegisterComponents()
        {
            var container = new UnityContainer();
            
            // 替换原来的container.AddNewExtension<NLogExtension>();
            container.RegisterType<ILogger>(new InjectionFactory((container, targetType, name) =>
            {
                // 根据注入的目标类型(控制器)创建对应的Logger
                return LogManager.GetLogger(targetType.FullName);
            }));

            DependencyResolver.SetResolver(new UnityDependencyResolver(container));
        }
    }
}
验证结果

修改后重新运行项目,不同控制器的日志会正确显示各自的类型全名:

2024-01-28 18:51:51.3988 TRACE SomeSite.Controllers.SomeController SomeController - Index 
2024-01-28 18:51:59.8301 TRACE SomeSite.Controllers.SomeController1 SomeController1 - Index

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 08:13:18