NLog注入ILogger后日志类名异常:指向扩展而非实际类
问题成因及解决方法
核心成因
你遇到的日志类别错误问题,本质是ILogger
如果你的注册代码是直接将ILogger<T>绑定到某个自定义扩展类的固定实例,或者没有让Unity根据泛型参数T动态创建对应的Logger,就会导致所有日志的类别被硬编码为扩展类的名称,而非实际使用Logger的业务类(比如TestClass、ClassXY)。
解决步骤
1. 修正Unity注册逻辑
确保Unity能为每个ILogger<T>动态创建对应类型的Logger实例,而非复用单一实例:
// 配置LoggerFactory并添加NLog提供器 var loggerFactory = LoggerFactory.Create(builder => { builder.AddNLog(); // 需确保已引用NLog.Extensions.Logging包 }); // 将LoggerFactory注册到容器 container.RegisterInstance<ILoggerFactory>(loggerFactory); // 让Unity自动解析泛型ILogger<T>,使用官方Logger<T>实现 container.Register(typeof(ILogger<>), typeof(Logger<>));
2. 规避错误注册方式
不要使用这类会固定日志类别的注册写法:
// 错误示例:所有ILogger<T>复用同一实例,日志类别固定为自定义扩展类 container.RegisterInstance(typeof(ILogger<>), new MyLoggerExtension());
3. 验证NLog配置
确保nlog.config中日志输出的布局包含正确的logger占位符,示例:
<targets> <target name="file" xsi:type="File" fileName="logs/${shortdate}.log" layout="${longdate}|${level:uppercase=true}|${threadid}|${logger}|${message} ${exception:format=tostring}" /> </targets>
其中${logger}会自动填充为ILogger<T>中T的类型名称。
内容的提问来源于stack exchange,提问作者Franz
相关产品推荐
相关产品推荐

