.NET Core 3.1单元测试:如何向ServiceCollection添加Serilog
在.NET Core 3.1测试项目中为ServiceCollection注册Serilog
针对你的场景,我提供两种方案:一种是无输出的哑Logger(适合不需要日志的测试),另一种是可以输出到测试控制台的Logger,两种都不需要依赖完整的Host,直接在ServiceCollection中配置即可。
方案一:无输出的哑Logger
如果只是需要满足依赖注入要求,不需要任何日志输出,直接使用Serilog自带的NullLogger即可,代码最简单:
[TestInitialize] public void Initialize() { var diCollection = new ServiceCollection() .AddSingleton(new SqlConnectionOption(_connectionstring)) .AddDbContext<DataContext>( options => { options.UseSqlServer(_connectionstring); } ) // 注册Serilog的NullLogger,无任何日志输出 .AddSingleton<ILogger>(NullLogger.Instance) .AddTransient<IMyRepository, MyRepository>(); _di = diCollection.BuildServiceProvider(); }
需要确保你已经安装了Serilog NuGet包,这个类是Serilog核心库自带的。
方案二:输出到测试控制台的Logger
如果希望日志能输出到测试运行的控制台窗口,需要稍微配置Serilog并接入.NET Core的日志系统:
步骤1:安装必要的NuGet包
首先安装以下三个包:
SerilogSerilog.Extensions.Logging(用于和.NET Core Logging集成)Serilog.Sinks.Console(用于输出到控制台)
步骤2:在测试初始化中配置Serilog并注册服务
using Serilog; using Microsoft.Extensions.Logging; // ... [TestInitialize] public void Initialize() { // 先配置Serilog,设置输出到控制台 Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() // 可以根据需要调整日志级别,比如Information/Warning等 .WriteTo.Console() .CreateLogger(); var diCollection = new ServiceCollection() .AddSingleton(new SqlConnectionOption(_connectionstring)) .AddDbContext<DataContext>( options => { options.UseSqlServer(_connectionstring); } ) // 将Serilog接入.NET Core的Logging体系 .AddLogging(loggingBuilder => { loggingBuilder.ClearProviders(); // 清除默认的日志提供器,避免重复输出 loggingBuilder.AddSerilog(dispose: true); // 注册Serilog,dispose参数确保测试结束后释放资源 }) // 为MyRepository注册非泛型ILogger(你的Repository依赖的是ILogger而非ILogger<T>) .AddSingleton<ILogger>(sp => sp.GetRequiredService<ILoggerFactory>().CreateLogger<MyRepository>() ) .AddTransient<IMyRepository, MyRepository>(); _di = diCollection.BuildServiceProvider(); } // 添加测试清理方法,确保Serilog资源被释放 [TestCleanup] public void Cleanup() { Log.CloseAndFlush(); }
说明:
ClearProviders():清除.NET Core默认的日志提供器,防止日志被重复输出到多个地方。AddSerilog(dispose: true):将Serilog设置为日志提供器,并在ServiceProvider销毁时自动释放Serilog资源。- 注册
ILogger时,我们通过ILoggerFactory创建了一个针对MyRepository的Logger,这样日志会带上Repository的类型信息,方便调试。
如果后续你想让Repository使用更符合.NET Core惯例的ILogger<MyRepository>,只需要把Repository的构造函数改成:
public MyRepository(DataContext dataContext, ILogger<MyRepository> logger) { _dataContext = dataContext; _logger = logger; }
这时就不需要单独注册ILogger了,.NET Core的Logging系统会自动为你注入对应的泛型Logger。
内容的提问来源于stack exchange,提问作者k.c.
相关产品推荐
相关产品推荐

