Serilog不输出任何内容

时间:2020-03-27 18:25:18

标签: c# serilog

使用.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");
        }

我已逐步调试该调试器,以确保正确设置了“ level”变量-这是一个名为“ Debug”的枚举,其值为1。

尽管Sql Server表创建成功,但我看不到插入任何行或任何日志txt文件。 我也尝试调用 logger.Error(content),但仍然没有输出。

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

1 个答案:

答案 0 :(得分:3)

Serilog.Sinks.MSSqlServer是“定期批处理”接收器和by default, it waits 5 seconds before sending the logs to the database。如果您的测试在接收器有机会将消息写入数据库之前结束,则它们只会丢失...

您需要确保在测试运行程序结束之前处置记录器,以强制接收器将日志记录刷新到此时的数据库。参见Lifecycle of Loggers

((IDisposable) logger).Dispose();

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

我猜您正在使用MSTest(由于TestMethod),因此您可能希望研究AssemblyInitialize and AssemblyCleanup,这将使您有机会初始化所有测试的记录器,并且在所有测试完成运行后进行清理...


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