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
没有。
尽管它们都使用相同的配置和凭据,但我特意为用户授予了 INSERT
和 SELECT
权限(在此处的另一个答案中建议)。我知道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 工作正常)的主要内容,如果未能解决你的问题,请参考以下文章