Serilog.Sinks.MSSqlServer WriteTo 不插入数据库(虽然 AuditTo 工作正常)

Posted

技术标签:

【中文标题】Serilog.Sinks.MSSqlServer WriteTo 不插入数据库(虽然 AuditTo 工作正常)【英文标题】:Serilog.Sinks.MSSqlServer WriteTo does not insert in DB (although AuditTo works fine) 【发布时间】:2022-01-03 00:47:08 【问题描述】:

在 ASP.NET MVC 项目 .NET 4.5.2 中,我使用 Serilog 2.10.0 和 Serilog.Sinks.MSSqlServer (5.6.1) 写入 SQL Server 的自定义列。

AuditTo 方法工作正常并将错误插入数据库,但 WriteTo 没有。

尽管它们都使用相同的配置和凭据,但我特意为用户授予了 INSERTSELECT 权限(在此处的另一个答案中建议)。我知道AuditTo 在过程中出现错误时会抛出异常,但我无法弄清楚我在使用WriteTo 时做错了什么。

你能给我一个提示吗?

谢谢!

var connstring = ConfigurationManager.AppSettings["serilog:write-to:MSSqlServer.connectionString"];

var sinkOpts = new MSSqlServerSinkOptions();
sinkOpts.TableName = ConfigurationManager.AppSettings["serilog:write-to:MSSqlServer.tableName"];
sinkOpts.AutoCreateSqlTable = false;
sinkOpts.BatchPostingLimit = 1;

var log = new LoggerConfiguration()
              .MinimumLevel.Verbose() 
              .WriteTo.MSSqlServer(connectionString: connstring,
                       columnOptions: GetSqlColumnOptions(),
                       sinkOptions: sinkOpts,
                       restrictedToMinimumLevel: LogEventLevel.Verbose);

return log.CreateLogger();

此外,我尝试启用调试但没有成功。我可能做错了什么,但输出窗口中没有显示错误。

_logger.Error("Error_Message", "TEST");
Serilog.Debugging.SelfLog.Enable(msg => Debug.WriteLine(msg));
Serilog.Debugging.SelfLog.Enable(Console.Error);

【问题讨论】:

【参考方案1】:

当您使用WriteTo(异步)时,Serilog 接收器(如 SQL Server 接收器)在后台线程上写入消息,而 AuditTo 总是立即写入消息(同步)。

如果您的应用程序在后台线程能够发送消息之前结束,它们就会丢失,这很可能是您的情况...

您有责任在应用程序结束之前刷新日志。见Lifecycle of Loggers。

您可以通过调用 Log.CloseAndFlush() 或通过处置您的记录器来做到这一点。

public static void Main(string[] args)

    Log.Logger = new LoggerConfiguration()
        // ...
        .CreateLogger();

    try
    
        // ...
    
    finally
    
        Log.CloseAndFlush(); // <##<##<##<##<##<##
    

【讨论】:

您好 Augusto,感谢您的回复!我在寻找解决方案时在另一个线程中阅读了您的回复,并且在记录错误后我已经添加了 CloseAndFlush 方法。我的问题是 AuditTo 和 Write To 有何不同?我怀疑它与自定义列有关,因为如果我使用默认表,WriteTo 和 AuditTo 的一切都运行顺利

以上是关于Serilog.Sinks.MSSqlServer WriteTo 不插入数据库(虽然 AuditTo 工作正常)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 appsettings.json 中使用多个单独的记录器 Serilog 文件