Serilog 不输出任何东西
Serilog Not Outputting Anything
使用 .Net 4.6 我有一个静态的 Serilog 助手 class - 我已经精简到如下要点:
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 服务器 table 创建正常,但我没有看到任何插入的行或任何日志 txt 文件。
我也试过调用 logger.Error(content) 但仍然没有输出。
我之前在不同的站点/项目上使用过相同的帮助程序代码,并且工作正常。
这次我错在哪里了?
Serilog.Sinks.MSSqlServer
是 "periodic batching" 接收器和 by default, it waits 5
seconds before sending the logs to the database。如果您的测试在接收器有机会将消息写入数据库之前结束,它们就会丢失...
您需要确保在测试 运行 结束 之前处理记录器,以强制接收器在此时将日志刷新到数据库。参见 Lifecycle of Loggers。
((IDisposable) logger).Dispose();
当然,如果你在多个测试中共享一个静态日志实例,你不能只将记录器放在单个测试中,因为这意味着下一个测试 运行s 不会有一个记录器可以写入... 在那种情况下,您应该查看测试框架对执行代码的支持,在测试套件 运行 开始之前,以及在测试套件 [=34] 开始时再次执行代码=]结束。
我猜您正在使用 MSTest(因为 TestMethod
),所以您可能想查看 AssemblyInitialize
and AssemblyCleanup
,这将使您有机会为所有测试初始化记录器,并在所有测试完成后清理 运行ning...
您可能对解决 Serilog 问题的其他想法感兴趣:
使用 .Net 4.6 我有一个静态的 Serilog 助手 class - 我已经精简到如下要点:
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 服务器 table 创建正常,但我没有看到任何插入的行或任何日志 txt 文件。 我也试过调用 logger.Error(content) 但仍然没有输出。
我之前在不同的站点/项目上使用过相同的帮助程序代码,并且工作正常。 这次我错在哪里了?
Serilog.Sinks.MSSqlServer
是 "periodic batching" 接收器和 by default, it waits 5
seconds before sending the logs to the database。如果您的测试在接收器有机会将消息写入数据库之前结束,它们就会丢失...
您需要确保在测试 运行 结束 之前处理记录器,以强制接收器在此时将日志刷新到数据库。参见 Lifecycle of Loggers。
((IDisposable) logger).Dispose();
当然,如果你在多个测试中共享一个静态日志实例,你不能只将记录器放在单个测试中,因为这意味着下一个测试 运行s 不会有一个记录器可以写入... 在那种情况下,您应该查看测试框架对执行代码的支持,在测试套件 运行 开始之前,以及在测试套件 [=34] 开始时再次执行代码=]结束。
我猜您正在使用 MSTest(因为 TestMethod
),所以您可能想查看 AssemblyInitialize
and AssemblyCleanup
,这将使您有机会为所有测试初始化记录器,并在所有测试完成后清理 运行ning...
您可能对解决 Serilog 问题的其他想法感兴趣: