MSTest中引用Serilog的C#类库无法输出日志至控制台及文件的问题
解决MSTest中Serilog日志无法输出的问题
1. 确保测试项目中正确初始化Serilog
类库本身不会自动初始化Serilog,需要在测试项目的全局初始化阶段完成配置加载与日志初始化。可以用AssemblyInitialize实现全局生效:
using Microsoft.VisualStudio.TestTools.UnitTesting; using Serilog; using Microsoft.Extensions.Configuration; using System.IO; [TestClass] public class TestGlobalSetup { [AssemblyInitialize] public static void Setup(TestContext context) { var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .Build(); Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(config) .CreateLogger(); } [AssemblyCleanup] public static void Teardown() { Log.CloseAndFlush(); } }
2. 检查appsettings.json的复制属性
右键测试项目中的appsettings.json → 属性,将「复制到输出目录」设置为如果较新则复制或始终复制,确保测试运行时能读取到配置文件。
3. 确认类库日志的依赖注入配置
如果类库通过ILogger<T>注入日志,测试项目需要手动配置DI容器并注册Serilog:
using Microsoft.Extensions.DependencyInjection; using Serilog; // 在测试方法或初始化方法中配置DI var services = new ServiceCollection(); services.AddLogging(builder => { builder.ClearProviders(); builder.AddSerilog(Log.Logger); }); // 获取类库服务实例 var serviceProvider = services.BuildServiceProvider(); var myService = serviceProvider.GetRequiredService<YourLibraryService>();
4. 配置测试运行器捕获控制台输出
在Visual Studio中,创建或编辑.runsettings文件,添加以下配置以确保测试运行器捕获控制台日志:
<RunSettings> <MSTest> <CaptureTraceOutput>true</CaptureTraceOutput> </MSTest> </RunSettings>
保存后,在测试资源管理器中选择该文件作为活动运行设置,重新执行测试。
5. 修正日志文件路径
File接收器的相对路径基于测试运行时的工作目录,可能与预期不符。可以改为绝对路径:
修改appsettings.json中的File配置:
{ "Name": "File", "Args": { "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] {Message:lj}{NewLine}{Exception}", "path": "{Directory}/test-logs/logs.txt" } }
或者在初始化时直接指定绝对路径:
.LogTo.File(Path.Combine(Directory.GetCurrentDirectory(), "test-logs/logs.txt"), rollingInterval: RollingInterval.Day)
内容的提问来源于stack exchange,提问作者Himanshu Garg
相关产品推荐
相关产品推荐

