除非强制处置,否则仅显示第一次记录

问题描述 投票:0回答:2

我正在使用 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 打开恢复包并运行测试:演示项目

c# .net-core sequence xunit serilog
2个回答
4
投票

看起来您遇到了同样的问题如本博客文章中所述。缺点是您有责任处置记录器,记录器会将其内容物冲入适当的水槽。


3
投票

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

这就是为什么我无法关闭并刷新我的变量。

© www.soinside.com 2019 - 2024. All rights reserved.