C#类库开发时私有内部类是否应当使用独立的ILogger实例
C#类库日志实现方案解答
1. Qux日志实例选型建议
优先选择专属ILogger<Qux>,优势如下:
- 日志分类更清晰:日志输出会自带
Qux类的分类标识,排查问题时可以快速区分日志是来自Foo本身还是内部辅助类Qux - 支持精细化配置:后续可以单独为
Qux配置日志级别、过滤规则、输出目标,复用ILogger<Foo>无法实现该能力
如果你的场景中Qux逻辑非常简单,完全属于Foo的附属逻辑,不需要单独分类管控,也可以直接将ILogger<Foo>传给Qux使用,只需将Qux的构造函数参数改为非泛型ILogger即可。
2. ILogger实例创建方案
完全兼容有DI、无DI两种场景,且不绑定任何具体日志框架,推荐基于微软官方日志抽象包Microsoft.Extensions.Logging.Abstractions实现:
2.1 DI场景实现
优先选择注入ILoggerFactory的方案,避免构造函数参数膨胀,也不需要对外暴露内部类相关的依赖:
public class Foo { private Qux _qux; private readonly ILogger<Foo> _logger; // DI场景构造函数 public Foo(IBar bar, ILoggerFactory loggerFactory) { // 创建Foo自身的Logger _logger = loggerFactory.CreateLogger<Foo>(); // 创建Qux专属的Logger var quxLogger = loggerFactory.CreateLogger<Qux>(); _qux = new Qux(quxLogger); } }
2.2 无DI场景兼容
通过构造函数重载实现,默认使用内置的空日志实现,无需用户配置任何日志依赖:
public class Foo { private Qux _qux; private readonly ILogger<Foo> _logger; // DI场景构造函数 public Foo(IBar bar, ILoggerFactory loggerFactory) { _logger = loggerFactory.CreateLogger<Foo>(); var quxLogger = loggerFactory.CreateLogger<Qux>(); _qux = new Qux(quxLogger); } // 无DI场景默认构造函数,自动使用空日志实现 public Foo(IBar bar) : this(bar, NullLoggerFactory.Instance) { } // 无DI场景支持用户传入自定义Logger的重载 public Foo(IBar bar, ILogger<Foo> logger) { _logger = logger; // 若选择复用Logger,直接传入即可,需提前修改Qux构造函数参数为ILogger _qux = new Qux(logger); } }
NullLoggerFactory是官方抽象包自带的空实现,不会产生任何日志输出,也不依赖任何第三方日志框架,完全满足无DI场景的轻量化使用需求。
内容的提问来源于stack exchange,提问作者jack
相关产品推荐
相关产品推荐

