1

使用 .Net 4.6 我有一个静态 Serilog 帮助器类 - 我已将其精简为以下要点:

public static class SerilogHelper
    {
        private static ILogger log;

        private static ILogger CreateLogger()
        {
            if (log == null)
            {
                string levelString = SSOSettingsFileManager.SSOSettingsFileReader.ReadString(
                                    "BizTalk.Common", "serilog.minimum-level");

                SerilogLevel level = (SerilogLevel)Enum.Parse(typeof(SerilogLevel), levelString);

                string conString = SSOSettingsFileManager.SSOSettingsFileReader.ReadString(
                                    "BizTalk.Common", "serilog.connection-string");

                var levelSwitch = new LoggingLevelSwitch();
                levelSwitch.MinimumLevel = (Serilog.Events.LogEventLevel)level;

                log = new LoggerConfiguration()
                    .MinimumLevel.ControlledBy(levelSwitch)
                    .WriteTo.MSSqlServer(connectionString: conString, tableName: "Serilog", autoCreateSqlTable: true)
                    .WriteTo.RollingFile("log-{Date}.txt")
                    .CreateLogger();
            }

            return log;
        }

        public static void WriteString(string content)
        {
            var logger = CreateLogger();
            logger.Information(content);
        }

我有以下单元测试:

        [TestMethod]
        public void UN_TestSerilog1()
        {  
            Common.Components.Helpers.SerilogHelper.WriteString("Simple logging");
        }

我已经通过调试器来确保“级别”变量设置正确——它是一个名为“调试”的枚举,值为 1。

虽然 Sql Server 表创建正常,但我没有看到任何插入的行或任何日志 txt 文件。我也试过调用logger.Error(content)但仍然没有输出。

我以前在不同的站点/项目上使用过相同的帮助代码,它工作正常。这次我哪里错了?

4

1 回答 1

3

Serilog.Sinks.MSSqlServer是一个“定期批处理”接收器,默认情况下,它会5在将日志发送到数据库之前等待几秒钟。如果您的测试在接收器有机会将消息写入数据库之前结束,它们就会丢失......

您需要确保在测试运行结束之前处理记录器,以强制接收器在该点将日志刷新到数据库。请参阅记录器的生命周期

((IDisposable) logger).Dispose();

当然,如果您在多个测试中共享一个静态日志实例,您不能只将记录器放在单个测试中,因为这意味着下一个运行的测试将没有记录器可写入...在这种情况下,您应该在测试套件运行开始之前查看您的测试框架对执行代码的支持一次,然后再一次查看测试套件运行结束时的执行代码。

我猜您正在使用 MSTest (因为TestMethod),所以您可能想要查看AssemblyInitializeandAssemblyCleanup,这将使您有机会为所有测试初始化​​记录器,并在所有测试完成运行后进行清理......


您可能对解决 Serilog 问题的其他想法感兴趣:Serilog MSSQL Sink does not write logs to database

于 2020-03-27T20:45:34.460 回答