簡體   English   中英

Serilog SelfLog 產生異常堆棧跟蹤,無法通過提前結束來提供關鍵位

[英]Serilog SelfLog produces exception stacktrace that fails to provide the cutial bit of by ending to early

考慮一個使用 Serilog 作為日志庫的 AspNetCore 應用程序。

我收到打印到 SelfLog 的異常。 從堆棧跟蹤中,我猜想在某處我正在記錄解構失敗的 object。 到目前為止,一切都很好。 我認為找到有問題的日志調用並修復它是一件小事。 例如,通過簡單地不使用解構或類似的方式。

不幸的是,我無法確定在我的應用程序中進行有問題的日志調用的確切位置。

堆棧跟蹤在相關行之前結束。

我怎么解決這個問題? 如何找到呼叫站點?

這也正常嗎? 堆棧跟蹤通常會在應用程序/庫邊界處終止嗎? 他們為什么要這樣做,恕我直言,這毫無意義。

System.NotSupportedException: Specified method is not supported.
   at System.Reflection.RuntimeMethodInfo.ThrowNoInvokeException()
   at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index)
   at Serilog.Capturing.PropertyValueConverter.GetProperties(Object value)+MoveNext()
   at System.Collections.Generic.LargeArrayBuilder`1.AddRange(IEnumerable`1 items)
   at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable`1 source)
   at Serilog.Events.StructureValue..ctor(IEnumerable`1 properties, String typeTag)
   at Serilog.Capturing.PropertyValueConverter.TryConvertCompilerGeneratedType(Object value, Destructuring destructuring, Type valueType, LogEventPropertyValue& result)
   at Serilog.Capturing.PropertyValueConverter.CreatePropertyValue(Object value, Destructuring destructuring, Int32 depth)
   at Serilog.Capturing.PropertyValueConverter.DepthLimiter.CreatePropertyValue(Object value, Destructuring destructuring)
   at Serilog.Capturing.PropertyValueConverter.GetProperties(Object value)+MoveNext()
   at System.Collections.Generic.LargeArrayBuilder`1.AddRange(IEnumerable`1 items)
   at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable`1 source)
   at Serilog.Events.StructureValue..ctor(IEnumerable`1 properties, String typeTag)
   at Serilog.Capturing.PropertyValueConverter.TryConvertCompilerGeneratedType(Object value, Destructuring destructuring, Type valueType, LogEventPropertyValue& result)
   at Serilog.Capturing.PropertyValueConverter.CreatePropertyValue(Object value, Destructuring destructuring, Int32 depth)
   at Serilog.Capturing.PropertyValueConverter.DepthLimiter.CreatePropertyValue(Object value, Destructuring destructuring)
   at Serilog.Capturing.PropertyValueConverter.<TryConvertEnumerable>g__MapToSequenceElements|14_1(IEnumerable sequence, Destructuring destructure)+MoveNext()
   at System.Collections.Generic.LargeArrayBuilder`1.AddRange(IEnumerable`1 items)
   at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable`1 source)
   at Serilog.Events.SequenceValue..ctor(IEnumerable`1 elements)
   at Serilog.Capturing.PropertyValueConverter.TryConvertEnumerable(Object value, Destructuring destructuring, Type valueType, LogEventPropertyValue& result)
   at Serilog.Capturing.PropertyValueConverter.CreatePropertyValue(Object value, Destructuring destructuring, Int32 depth)
   at Serilog.Capturing.PropertyValueConverter.DepthLimiter.CreatePropertyValue(Object value, Destructuring destructuring)
   at Serilog.Capturing.PropertyValueConverter.GetProperties(Object value)+MoveNext()
   at System.Collections.Generic.LargeArrayBuilder`1.AddRange(IEnumerable`1 items)
   at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable`1 source)
   at Serilog.Events.StructureValue..ctor(IEnumerable`1 properties, String typeTag)
   at Serilog.Capturing.PropertyValueConverter.TryConvertCompilerGeneratedType(Object value, Destructuring destructuring, Type valueType, LogEventPropertyValue& result)
   at Serilog.Capturing.PropertyValueConverter.CreatePropertyValue(Object value, Destructuring destructuring, Int32 depth)
   at Serilog.Capturing.PropertyValueConverter.DepthLimiter.CreatePropertyValue(Object value, Destructuring destructuring)
   at Serilog.Capturing.PropertyValueConverter.GetProperties(Object value)+MoveNext()
   at System.Collections.Generic.LargeArrayBuilder`1.AddRange(IEnumerable`1 items)
   at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable`1 source)
   at Serilog.Events.StructureValue..ctor(IEnumerable`1 properties, String typeTag)
   at Serilog.Capturing.PropertyValueConverter.TryConvertCompilerGeneratedType(Object value, Destructuring destructuring, Type valueType, LogEventPropertyValue& result)
   at Serilog.Capturing.PropertyValueConverter.CreatePropertyValue(Object value, Destructuring destructuring, Int32 depth)
   at Serilog.Capturing.PropertyValueConverter.DepthLimiter.CreatePropertyValue(Object value, Destructuring destructuring)
   at Serilog.Capturing.PropertyValueConverter.<TryConvertEnumerable>g__MapToSequenceElements|14_1(IEnumerable sequence, Destructuring destructure)+MoveNext()
   at System.Collections.Generic.LargeArrayBuilder`1.AddRange(IEnumerable`1 items)
   at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable`1 source)
   at Serilog.Events.SequenceValue..ctor(IEnumerable`1 elements)
   at Serilog.Capturing.PropertyValueConverter.TryConvertEnumerable(Object value, Destructuring destructuring, Type valueType, LogEventPropertyValue& result)
   at Serilog.Capturing.PropertyValueConverter.CreatePropertyValue(Object value, Destructuring destructuring, Int32 depth)
   at Serilog.Capturing.PropertyValueConverter.DepthLimiter.CreatePropertyValue(Object value, Destructuring destructuring)
   at Serilog.Capturing.PropertyValueConverter.GetProperties(Object value)+MoveNext()
   at System.Collections.Generic.LargeArrayBuilder`1.AddRange(IEnumerable`1 items)
   at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable`1 source)
   at Serilog.Events.StructureValue..ctor(IEnumerable`1 properties, String typeTag)
   at Serilog.Capturing.PropertyValueConverter.TryConvertCompilerGeneratedType(Object value, Destructuring destructuring, Type valueType, LogEventPropertyValue& result)
   at Serilog.Capturing.PropertyValueConverter.CreatePropertyValue(Object value, Destructuring destructuring, Int32 depth)
   at Serilog.Core.Logger.BindProperty(String propertyName, Object value, Boolean destructureObjects, LogEventProperty& property)
   at Serilog.Extensions.Logging.SerilogLogger.Write[TState](LogEventLevel level, EventId eventId, TState state, Exception exception, Func`3 formatter)
   at Serilog.Extensions.Logging.SerilogLogger.Log[TState](LogLevel logLevel, EventId eventId, TState state, Exception exception, Func`3 formatter)

具體不是很確定這個,我只能給你一些關於如何記錄和查找原因的指示。

我開發容錯企業應用程序的方式是使用帶有可配置日志級別的 try-catch-finally 使用這種方法,如果您正在調試、獲取信息或只是簡單的錯誤,您可以根據需要打開或關閉級別。

我用:

  • 嘗試 - 做邏輯
  • catch - 捕獲異常並記錄它
  • finally - 釋放資源

如果我真的希望 go 額外的步驟,我會有額外的日志記錄級別:

  try {
       logger.Info("Info :: I'm doing business call X");
       logger.Debug($"Debug :: I'm using object {foo}, calling foo.logic()");
       
       foo.Logic();
       
       logger.Info("Debug :: Succesfully called foo.logic()");
   }
   catch (Exception exc) {
    logger.Debug($"Error :: Failed business case foo.logic() and object info : {foo}");
    logger.Error($"Error :: Exception {exc}");

   }
   finally {
    foo.CleanUp();
    foo = null;
   }

使用這種方法,我可以輕松地在 catch 或 finally 中放置一些斷點,並找出導致應用程序中斷的原因。 最重要的是,有詳細的日志記錄可供調試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM