【问题标题】:Only first logging shows unless forcefully disposing只有第一次记录显示,除非强制处置
【发布时间】:2017-09-17 03:17:04
【问题描述】:

我正在使用 vs 2017,编写一个 netcoreapp2.0 库,并使用 UnitTest 项目对其进行测试(XUnit 和 NUnit 给出相同的结果)。
我注意到,除非我强制处理我的 Serilog 记录器,否则只有第一行会在 Seq 中结束。

这是我的 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" />

有什么建议吗?

(这里是一个演示项目的链接,用vs 2017打开恢复包并运行测试:demo project

【问题讨论】:

    标签: c# .net-core xunit seq serilog


    【解决方案1】:

    您似乎遇到了同样的问题as described in this blog post. 简而言之,您负责处理您的记录器,这会将其内容刷新到适当的接收器。

    【讨论】:

    • 是的。真的。我也会添加我的答案,因为我必须做更多的工作
    【解决方案2】:

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

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

    【讨论】:

    • 在变量上,你可以直接调用Dispose()——它本质上和CloseAndFlush()是一样的。 HTH!
    • @NicholasBlumhardt 确实如此。队友的欢呼声。目前对于这个单元测试项目,静态记录器的工作方式与我所做的一样,但很高兴知道它可以以非常相似的方式使用变量来完成。
    猜你喜欢
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多