只有第一次记录显示,除非强行处置

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()....

因此我无法关闭并刷新我的变量一。