簡體   English   中英

在xunit.console.exe出口上干凈地解決Serilog Pump ThreadAbortException

[英]Cleanly resolving Serilog Pump ThreadAbortException on xunit.console.exe exit

當我關閉使用Serilog的應用程序時,我從xunit.console.exe收到以下異常:

System.AggregateException: One or more errors occurred. ---> System.Threading.ThreadAbortException: Thread was being aborted.
   at Serilog.Sinks.Async.BackgroundWorkerSink.Pump()
   at System.Threading.Tasks.Task.Execute()
   --- End of inner exception stack trace ---
   at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
   at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
   at Serilog.Sinks.Async.BackgroundWorkerSink.Dispose()
   at Serilog.LoggerConfiguration.<CreateLogger>b__28_0()
---> (Inner Exception #0) System.Threading.ThreadAbortException: Thread was being aborted.
   at Serilog.Sinks.Async.BackgroundWorkerSink.Pump()
   at System.Threading.Tasks.Task.Execute()<---

是的,我已經做了一些大膽的事情(創建了一個由Serilog WriteTo.Async包裝的記錄器),但是我需要找出最干凈的方法來避免引發異常,然后回到干凈的測試運行中。 (如果有一個用於程序集未初始化的鈎子,我會在其中調用Log.CloseAndFlush()

(是的,我很欣賞單元測試不應連接重量級的日志記錄,但是我仍然需要解決集成測試的問題)

(當我提出疑問時,它會自我回答;我只是無法在谷歌上找到答案,並相信一個人應該能夠)

不僅要修復您的代碼,沒有意義-進行測試的全部目的是聆聽它們;)

在此特定實例中,一些代碼靜態地構建了記錄器/審計器,這些記錄器/審計器對於應用程序的行為非常重要,它們應該以構造函數依賴關系的形式出現,而不是隱藏在第一個實例內部的靜態變量中。

我到達這一點的原因是,我的應用程序具有跨領域的日志記錄要求,對於吞吐量而言,它是至關重要的,以至於導致我切換日志記錄方法-被迫將其推向更好的位置,這是一個勝利(並且將它隱藏起來,是在測試的背景下,為支付附帶的事情的性能費用而滑坡的另一步)。

暫無
暫無

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

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