C# Serilog不输出任何内容

C# Serilog不输出任何内容,c#,serilog,C#,Serilog,使用.Net 4.6,我有一个静态Serilog帮助程序类-我已将其精简为以下要点: public static class SerilogHelper { private static ILogger log; private static ILogger CreateLogger() { if (log == null) { string levelStr

使用.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");
        }
我已经通过了调试器,以确保级别变量设置正确-它是一个名为Debug的枚举,值为1

虽然Sql Server表的创建是正常的,但我没有看到任何插入的行或任何日志txt文件。 我还尝试调用logger.Errorcontent,但仍然没有输出

我以前在不同的站点/项目上使用过相同的帮助程序代码,效果不错。 这次我哪里出错了?

Serilog.Sinks.MSSqlServer是一个周期性的批处理接收器,并且。如果您的测试在接收器有机会将消息写入数据库之前结束,那么它们就会丢失

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

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

我猜您之所以使用MSTest是因为TestMethod,所以您可能想研究一下,这将使您有机会为所有测试初始化记录器,并在所有测试完成运行后进行清理

您可能会对解决Serilog问题的其他想法感兴趣:

Serilog.Sinks.MSSqlServer是一个定期批处理接收器,并且是。如果您的测试在接收器有机会将消息写入数据库之前结束,那么它们就会丢失

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

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

我猜您之所以使用MSTest是因为TestMethod,所以您可能想研究一下,这将使您有机会为所有测试初始化记录器,并在所有测试完成运行后进行清理


您可能对解决Serilog问题的其他想法感兴趣:

包装Serilog是个坏主意-如果您想要一个不是疯狂想法的静态方法,请在您的合成根目录中遵循-initialzie。在serilog selflog中搜索诊断信息它在wiki的某个地方我链接了Rapping serilog是个坏主意-如果你想要一个没有疯狂想法的静态serilog,在你的作文根中跟随-initialzie。在serilog selflog上搜索我链接的wiki中的诊断信息
((IDisposable) logger).Dispose();