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

如何在非ASP Core类库中配置Serilog适配Microsoft.Extensions.Logging

适配Serilog为Microsoft.Extensions.Logging.ILogger用于非ASP.NET Core项目的NUnit测试

问题场景

类库依赖Microsoft.Extensions.Logging.ILogger<MyServiceApplicationLayer>作为构造参数,使用者并非ASP.NET Core项目。在NUnit测试中直接创建Serilog原生Serilog.ILogger实例传入时,因类型不匹配报错,需要将Serilog适配为符合Microsoft.Extensions.Logging规范的ILogger实例。

解决方案

通过Serilog提供的桥接包,将Serilog集成到Microsoft.Extensions.Logging的日志体系中,生成符合要求的ILogger实例。

1. 安装必要NuGet包

需要安装以下包:

  • Serilog.Extensions.Logging:实现Serilog与Microsoft.Extensions.Logging的桥接
  • Serilog.Sinks.File:文件日志输出(根据你的需求选择对应接收器)
  • Microsoft.Extensions.Logging:日志抽象核心包

2. 修改NUnit测试的SetUp方法

构建LoggerFactory并注入Serilog提供器,创建匹配类库要求的ILogger实例:

using Microsoft.Extensions.Logging;
using Serilog;

ILogger<MyServiceApplicationLayer> _logger;
MyServiceApplicationLayer _serviceApplicationLayer;

[SetUp]
public void Setup()
{
    // 配置Serilog实例
    var serilogLogger = new LoggerConfiguration()
        .MinimumLevel.Debug()
        .MinimumLevel.Override("Microsoft", Serilog.Events.LogEventLevel.Information)
        .Enrich.FromLogContext()
        .WriteTo.File("log.txt",
            rollingInterval: RollingInterval.Day,
            rollOnFileSizeLimit: true)
        .CreateLogger();

    // 创建LoggerFactory并添加Serilog作为日志提供器
    var loggerFactory = LoggerFactory.Create(builder =>
    {
        builder.AddSerilog(serilogLogger);
    });

    // 生成类库所需的ILogger<MyServiceApplicationLayer>实例
    _logger = loggerFactory.CreateLogger<MyServiceApplicationLayer>();

    // 初始化待测试的类实例
    _serviceApplicationLayer = new MyServiceApplicationLayer(_logger);
}

3. 可选:验证日志内容(断言)

如果需要在测试中验证日志是否正确输出,可以使用Serilog的内存日志接收器:

  1. 安装Serilog.Sinks.InMemory包
  2. 修改Serilog配置并在测试中捕获日志:
// SetUp中修改Serilog配置
var serilogLogger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .MinimumLevel.Override("Microsoft", Serilog.Events.LogEventLevel.Information)
    .Enrich.FromLogContext()
    .WriteTo.File("log.txt", rollingInterval: RollingInterval.Day, rollOnFileSizeLimit: true)
    .WriteTo.InMemory() // 添加内存接收器
    .CreateLogger();

// 测试方法中断言日志内容
[Test]
public void TestLogging()
{
    // 调用类库中会触发日志的方法
    _serviceApplicationLayer.SomeMethodThatLogs();

    // 获取内存中的日志事件
    var loggedEvents = Serilog.Sinks.InMemory.InMemorySink.Instance.LogEvents;

    // 断言是否存在预期的日志
    Assert.That(loggedEvents.Any(e => e.MessageTemplate.Text.Contains("Expected log message")), Is.True);
}

内容的提问来源于stack exchange,提问作者Álvaro García

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 17:45:26