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

NLog注入ILogger后日志类名异常:指向扩展而非实际类

问题成因及解决方法

核心成因

你遇到的日志类别错误问题,本质是ILogger的注册逻辑没有正确传递泛型参数T到NLog的Logger实例。

如果你的注册代码是直接将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 21:04:51