序列号不输出任何内容



使用.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。

尽管SqlServer表创建得还可以,但我没有看到任何插入的行或任何日志txt文件。我也试过调用logger.Error(content(,但仍然没有输出。

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

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

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

((IDisposable) logger).Dispose();

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

我猜你正在使用MSTest(因为TestMethod(,所以你可能想研究AssemblyInitializeAssemblyCleanup,这将使你有机会初始化所有测试的记录器,并在所有测试完成运行后进行清理。。。


您可能对解决Serilog问题的其他想法感兴趣:Serilog MSSQL Sink不将日志写入数据库

相关内容

最新更新