我正在使用 vs 2017,编写一个 netcoreapp2.0 库,并使用 UnitTest 项目对其进行测试(XUnit 和 NUnit 给出相同的结果)。
我注意到,除非我强制处置我的 Serilog 记录器,否则只有第一行最终会出现在 Seq 中。
这是我的两堂课。图书馆一:
public class Class1
{
public static Logger _log;
public Class1(Logger log)
{
_log = log;
_log.Verbose("Class 1 constructor finished");
}
public void LogMessage(string s)
{
_log.Debug("Got message: {Message}", s);
}
}
和单元测试:
public class UnitTest1
{
public static Logger _log = new LoggerConfiguration()
.WriteTo.Seq("http://localhost:5341", Serilog.Events.LogEventLevel.Verbose)
.MinimumLevel.Verbose()
.CreateLogger();
[Fact]
public void Test1()
{
_log.Debug("Test 1 logging");
var c = new Class1(_log);
c.LogMessage("Logging from test");
_log.Information("Test finished");
_log.Dispose(); // Without this, only "Test 1 logging" is logged.
}
}
引用的程序集(来自单元测试项目):
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0-preview-20170628-02" />
<PackageReference Include="serilog" Version="2.5.0" />
<PackageReference Include="serilog.sinks.seq" Version="3.3.3" />
<PackageReference Include="xunit" Version="2.2.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
有什么建议吗?
(这是一个演示项目的链接,使用 vs 2017 打开恢复包并运行测试:演示项目)
看起来您遇到了同样的问题如本博客文章中所述。缺点是您有责任处置记录器,记录器会将其内容物冲入适当的水槽。
根据Stephen的建议,问题在于记录器的生命范围。
由于我是从单元测试类记录的,所以我觉得处理记录器是错误的,但解决方案是从使用类变量记录器更改为使用静态全局记录器。
这允许我在创建测试时设置一次,并在所有测试运行后将其处理一次:
[SetUpFixture]
public class TestsSetup
{
[OneTimeSetUp]
public void RunBeforeAnyTests()
{
Log.Logger = new LoggerConfiguration().Enrich.WithExceptionDetails()
.WriteTo.Seq("http://localhost:5341")
.MinimumLevel.Verbose()
.CreateLogger();
}
[OneTimeTearDown]
public void RunAfterAnyTests()
{
Log.CloseAndFlush();
}
}
我遇到的主要困惑是
CloseAndFlush
存在于静态对象上,但不存在于使用 创建静态对象时得到的
ILogger
上
Logger _log = new LoggerConfiguration()....
这就是为什么我无法关闭并刷新我的变量。