如何在非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的内存日志接收器:
- 安装
Serilog.Sinks.InMemory包 - 修改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
相关产品推荐
相关产品推荐

