只有第一次记录显示,除非强行处置
Only first logging shows unless forcefully disposing
我正在使用 vs 2017,编写一个 netcoreapp2.0 库,并使用 UnitTest 项目对其进行测试(XUnit 和 NUnit 给出相同的结果)。
我注意到除非我强行处理我的 Serilog 记录器,否则只有第一行会在 Seq.[=14= 中结束]
这是我的 2 类。图书馆一:
public class Class1
{
public static Logger _log;
public Class1(Logger log)
{
_log = log;
_log.Verbose("Class 1 constructor fineshed");
}
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 fineshed");
_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" />
有什么建议吗?
(这是一个 link 的演示项目,用 vs 2017 打开恢复包和 运行 测试:demo project )
看起来您 运行 遇到了同样的问题 as described in this blog post. 简而言之,您负责处理记录器,它将其内容刷新到适当的接收器。
根据 Stephen 的建议,问题是记录器的生命周期。
因为我是从单元测试 class 记录日志的,我觉得处理记录器是错误的,但解决方案是从使用 class 变量记录器更改为使用静态记录器全局记录器。
这允许我在测试创建时设置一次,并在所有测试后处理一次 运行 :
[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()....
因此我无法关闭并刷新我的变量一。
我正在使用 vs 2017,编写一个 netcoreapp2.0 库,并使用 UnitTest 项目对其进行测试(XUnit 和 NUnit 给出相同的结果)。
我注意到除非我强行处理我的 Serilog 记录器,否则只有第一行会在 Seq.[=14= 中结束]
这是我的 2 类。图书馆一:
public class Class1
{
public static Logger _log;
public Class1(Logger log)
{
_log = log;
_log.Verbose("Class 1 constructor fineshed");
}
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 fineshed");
_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" />
有什么建议吗?
(这是一个 link 的演示项目,用 vs 2017 打开恢复包和 运行 测试:demo project )
看起来您 运行 遇到了同样的问题 as described in this blog post. 简而言之,您负责处理记录器,它将其内容刷新到适当的接收器。
根据 Stephen 的建议,问题是记录器的生命周期。
因为我是从单元测试 class 记录日志的,我觉得处理记录器是错误的,但解决方案是从使用 class 变量记录器更改为使用静态记录器全局记录器。
这允许我在测试创建时设置一次,并在所有测试后处理一次 运行 :
[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()....
因此我无法关闭并刷新我的变量一。