【问题标题】:Serilog is not writing to the database consistentlySerilog 没有一致地写入数据库
【发布时间】:2020-04-23 08:52:01
【问题描述】:

我正在使用下面的代码,每次运行代码时,我都会在 LogErrorToDatabase 方法中看到断点。但是,有时我会在数据库中看到 ErrorGuid 的日志条目,有时我看不到任何日志条目。 ErrorGuid 被返回到客户端,但缺少 DB 条目。

public async Task<ActionResult<IEnumerable<Location>>> Get()
        {
            try { 
                Log.Information("Inside Locations Get");
                int a = int.Parse("?"); //Uncomment to test error handling
                return await Repo.Get<Location>().ToListAsync();
            }
            catch (Exception ex)
            {
                //Log error
                var id = Guid.NewGuid();
                await LogErrorToDatabase(ex, id);
                return BadRequest(new ErrorDetail()
                {
                    ErrorGuid = id
                });

            }
        }

        public async Task LogErrorToDatabase(Exception ex, Guid id)
        {
            await Task.Run(() => Log.ForContext("ErrorGuid", id)
                    .Error(ex, "Error occured with getting the Location List"));
        }

我不知道这种随机性。任何帮助将不胜感激。

【问题讨论】:

标签: sql-server database logging serilog


【解决方案1】:

您可以采取几个步骤来排除消息未写入 Serilog Sink 的原因。您可以在 SO 的另一个答案中看到其中的一些:

Serilog MSSQL Sink doesn't write logs to database


更新String or binary data would be truncated 是一个常见的 SQL Server 异常,当您尝试存储大于表字段可以存储的值时会发生这种异常。例如,如果您有一个nvarchar(4) 字段并尝试存储abcde(5 个字符),您将得到相同类型的异常。

您要么必须增加用于存储信息的数据库中字段的大小,要么必须限制在 C# 代码中登录的字符数。

【讨论】:

  • 我现在有另一个问题。如果我的 web api 调用在 DB 中记录了一次错误,并且我尝试在不同的页面上再次调用相同的 API,则它不会第二次在数据库中记录错误。有什么线索吗?
【解决方案2】:

谢谢卡洛。您的回复很有帮助。我通过从 WriteTo 切换到 AuditTo 来打开审计,设置 "period": 1 并添加 Log.CloseAndFlush();并将以下错误记录到我的 SQL 数据库中。我们将不胜感激。

System.AggregateException: Failed to emit a log event. (String or binary data would be truncated.
The statement has been terminated.)
 ---> System.Data.SqlClient.SqlException (0x80131904): String or binary data would be truncated.
The statement has been terminated.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite, String method)
   at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite, String methodName)
   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   at Serilog.Sinks.MSSqlServer.MSSqlServerAuditSink.Emit(LogEvent logEvent)
   at Serilog.Core.Sinks.AggregateSink.Emit(LogEvent logEvent)
ClientConnectionId:c0e1f1a4-b655-4be1-b655-c8954f44d299
Error Number:8152,State:2,Class:16
   --- End of inner exception stack trace ---
   at Serilog.Core.Sinks.AggregateSink.Emit(LogEvent logEvent)
   at Serilog.Core.Logger.Dispatch(LogEvent logEvent)
   at Serilog.Core.Logger.Serilog.Core.ILogEventSink.Emit(LogEvent logEvent)
   at Serilog.Core.Logger.Dispatch(LogEvent logEvent)
   at Serilog.Core.Logger.Serilog.Core.ILogEventSink.Emit(LogEvent logEvent)
   at Serilog.Core.Logger.Dispatch(LogEvent logEvent)
   at Serilog.Core.Logger.Write(LogEventLevel level, Exception exception, String messageTemplate, Object[] propertyValues)
   at Serilog.Core.Logger.Write(LogEventLevel level, String messageTemplate, Object[] propertyValues)
   at Serilog.Core.Logger.Write[T0,T1,T2](LogEventLevel level, String messageTemplate, T0 propertyValue0, T1 propertyValue1, T2 propertyValue2)
   at Serilog.Core.Logger.Error[T0,T1,T2](String messageTemplate, T0 propertyValue0, T1 propertyValue1, T2 propertyValue2)
   at MCF.API.ExtensionHelpers.ExceptionMiddleware.InvokeAsync(HttpContext httpContext) in 

【讨论】:

  • 最好将其编辑到您的问题中并将其删除.... - 如果您确实想@某人,您可以在他们的回复中添加评论。另外,不要输入Thanks,如果答案有帮助,我们会将向上的菱形按在投票柜台上。
猜你喜欢
  • 2020-12-23
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
  • 1970-01-01
  • 2014-10-10
相关资源
最近更新 更多