使用.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),但仍然没有输出。
我以前在不同的站点/项目上使用了相同的帮助程序代码,并且工作正常。 这次我哪里出错了?
答案 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