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

.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包

首先安装以下三个包:

  • Serilog
  • Serilog.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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:42:33