自定义ILogger/ILogProvider实现中Log<TState>方法未被调用问题
自定义ILogger的Log方法未触发排查方案
排查优先级从高到低:
- 核对
Log<TState>方法签名完全匹配官方接口定义
90%以上的此类问题都是签名不一致导致编译器将你的方法识别为自定义重载,而非接口实现,官方接口签名如下:
常见写错的点包括:void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func<TState, Exception?, string> formatter)formatter参数的两个入参顺序写反,写成Func<Exception, TState, string>- .NET 6+带可空上下文的场景下漏加参数可空标注
- 泛型参数声明位置错误
- 检查方法访问级别与实现方式
如果你使用显式接口实现,必须带ILogger.前缀声明方法,不能直接作为类的普通公共方法:
禁止将该方法声明为// 正确的显式接口实现写法 void ILogger.Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func<TState, Exception?, string> formatter) { // 业务逻辑 }private/internal,必须保证接口层面可访问。 - 排除第三方日志框架代理拦截
若项目中同时引入了Serilog、NLog、Log4Net等第三方日志框架的自动集成包,这些包会默认注入自己的ILogger代理实现,拦截所有日志调用优先走自身处理逻辑,不会转发到自定义ILogger实现。这种情况需要移除第三方日志的自动注入配置,或者调整Provider注册顺序。 - 检查全局日志过滤规则
即使IsEnabled固定返回true,如果在注册日志服务时配置了全局过滤规则,或者appsettings.json的Logging配置段对对应日志分类(本次场景为HealthCheckMasterDatabase的完整类名)设置了高于Information的日志等级,也可能导致日志调用被框架层提前拦截,不会走到Log方法。 - 确认CreateLogger返回的实例正确
检查ILoggerProvider.CreateLogger方法返回的是你自定义的ILogger实现类实例,避免错误返回内置Logger类或其他Provider生成的Logger实例。
内容的提问来源于stack exchange,提问作者Shawn Lehner
相关产品推荐
相关产品推荐

