Serilog не записывает в базу данных последовательно - PullRequest
0 голосов
/ 22 апреля 2020

Я использую приведенный ниже код, и каждый раз, когда я запускаю код, я вижу попадание точки останова в метод LogErrorToDatabase. Однако иногда я вижу запись журнала для ErrorGuid в базе данных, а иногда я не вижу записей журнала. ErrorGuid возвращается на клиентскую сторону, но отсутствует запись в БД.

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"));
        }

Я понятия не имею об этой случайности. Любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Есть несколько шагов, которые вы можете предпринять, чтобы выяснить, почему сообщения не записываются в Serilog Sink. Их можно увидеть в другом ответе здесь, в SO:

Serilog MS SQL Раковина не записывает журналы в базу данных


Обновление : String or binary data would be truncated является распространенным SQL Серверным исключением, которое возникает, когда вы пытаетесь сохранить значение, которое больше, чем может хранить поле таблицы. Например, если у вас есть поле nvarchar(4) и вы пытаетесь сохранить abcde (5 символов), вы получите такое же исключение.

Вы должны либо увеличить размер полей в базе данных, которую вы используете для хранения информации, либо ограничить количество символов, которые вы регистрируете в своем коде C#.

0 голосов
/ 22 апреля 2020

Спасибо, Кало. Ваш ответ был полезен. Я включил Аудит, переключившись с WriteTo на AuditTo, установил «period»: 1 и добавил Log.CloseAndFlu sh (); и получите приведенную ниже ошибку в моей базе данных 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...