.NET Core Serilog测试疑问:为何需AddLogging注册ILogger
问题原因解析
核心差异在于你使用的AddSerilog重载和官方文档默认的集成场景不同:
官方文档里提到的“无需
AddLogging(b => b.AddSerilog())”,是针对**通过Host.CreateDefaultBuilder().UseSerilog()**的集成方式。这个方法内部会自动完成两件事:- 初始化Microsoft.Extensions.Logging的基础服务(包括
LoggerFactory和ILogger<T>的创建工厂); - 将Serilog注册为日志提供者,打通Serilog和MS Logging体系的关联。
- 初始化Microsoft.Extensions.Logging的基础服务(包括
而你在测试中直接调用
serviceCollection.AddSerilog(),这个重载仅注册了Serilog自身的核心服务(比如Serilog.ILogger),没有初始化MS Logging的基础服务,也没有把Serilog接入MS Logging的提供者体系。ILogger<T>是由MS Logging的LoggerFactory创建的,此时这个工厂根本不知道Serilog的存在,自然无法解析ILogger<SerilogLoggingTests>。当你添加
serviceCollection.AddLogging(b => b.AddSerilog())时:AddLogging()会先注册MS Logging的全套基础服务(包括ILogger<T>的依赖链);b.AddSerilog()则把Serilog添加为日志提供者,让LoggerFactory知道要通过Serilog来创建日志实例,因此GetRequiredService<ILogger<T>>可以正常工作。
测试场景的替代写法
如果不想用链式调用,也可以拆分两步达到同样效果:
// 先初始化MS Logging基础服务 serviceCollection.AddLogging(); // 再将Serilog注册为日志提供者 serviceCollection.AddSerilog();
内容的提问来源于stack exchange,提问作者harishr
相关产品推荐
相关产品推荐

