以下是一些可以帮助您解决问题的想法:
你测试的是Verbose
or Debug
仅事件?这可能就是原因。您没有为 Serilog 指定全局最低级别(您只为充当过滤器的接收器指定了最低级别),并且默认最小值是Information https://github.com/serilog/serilog/wiki/Configuration-Basics#minimum-level, 意思是Verbose
and Debug
正在被忽略...指定全局MinimumLevel
对于 Serilog:
ILogger logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.WriteTo.MSSqlServer(connectionString,
tableName,
autoCreateSqlTable: autoCreateSqlTable,
restrictedToMinimumLevel: LogEventLevel.Verbose,
columnOptions: GetSQLSinkColumnOptions(),
batchPostingLimit: batchPostingLimit)
.CreateLogger();
您要处置您的记录器吗?Serilog.Sinks.MSSqlServer
是一个“定期批处理接收器”,因此您需要确保在最后处理记录器以强制它将日志刷新到数据库。看记录器的生命周期 https://github.com/serilog/serilog/wiki/Lifecycle-of-Loggers.
((IDisposable) logger).Dispose();
即使你正在使用1
for batchPostingLimit
, 它等待着5默认情况下,将日志发送到数据库之前的秒数 https://github.com/serilog/serilog-sinks-mssqlserver/blob/dev/src/Serilog.Sinks.MSSqlServer/Sinks/MSSqlServer/MSSqlServerSink.cs#L42。如果您的应用程序在此期间之前关闭并且您没有处置记录器,则消息将丢失。
为了排除故障,请使用AuditTo
代替WriteTo
(并删除batchPostingLimit
不适用于审计)。WriteTo
是安全的并且会吃掉任何异常,同时AuditTo
会让异常冒出来。
ILogger logger = new LoggerConfiguration()
.AuditTo.MSSqlServer(
connectionString,
tableName,
restrictedToMinimumLevel: LogEventLevel.Verbose,
autoCreateSqlTable: true)
.CreateLogger();
当然,一旦你弄清楚出了什么问题,就回到WriteTo
.