2015-09-25 24 views
3

我使用hangfire,循環任務運行進程。這些任務設置爲每分鐘啓動並處理來自數據庫的數千行。運行在hangfire中的log4net內部方法的線程錯誤

我讓它們在我的測試環境中順利運行,直到我在這些方法內部添加了log4net日誌記錄。現在log4net會拋出一個線程錯誤。

log4net:ERROR Failed to append to appender [AdoNetAppender] 
System.Threading.ThreadAbortException: Thread was being aborted. 
    at System.Threading.Monitor.ReliableEnter(Object obj, Boolean& lockTaken) 
    at System.Threading.Monitor.Enter(Object obj, Boolean& lockTaken) 
    at log4net.Appender.AppenderSkeleton.DoAppend(LoggingEvent loggingEvent) 
    at log4net.Util.AppenderAttachedImpl.AppendLoopOnAppenders(LoggingEvent loggingEvent) 
log4net:ERROR Exception while logging 
System.Threading.ThreadAbortException: Thread was being aborted. 
    at log4net.Util.AppenderAttachedImpl.AppendLoopOnAppenders(LoggingEvent loggingEvent) 
    at log4net.Repository.Hierarchy.Logger.CallAppenders(LoggingEvent loggingEvent) 
    at log4net.Repository.Hierarchy.Logger.ForcedLog(Type callerStackBoundaryDeclaringType, Level level, Object message, Exception exception) 
    at log4net.Repository.Hierarchy.Logger.Log(Type callerStackBoundaryDeclaringType, Level level, Object message, Exception exception) 
log4net:ERROR Failed to append to appender [AdoNetAppender] 
System.Threading.ThreadAbortException: Thread was being aborted. 
    at System.Threading.Monitor.ReliableEnter(Object obj, Boolean& lockTaken) 
    at System.Threading.Monitor.Enter(Object obj, Boolean& lockTaken) 
    at log4net.Appender.AppenderSkeleton.DoAppend(LoggingEvent loggingEvent) 
    at log4net.Util.AppenderAttachedImpl.AppendLoopOnAppenders(LoggingEvent loggingEvent) 
log4net:ERROR Exception while logging 
System.Threading.ThreadAbortException: Thread was being aborted. 
    at log4net.Util.AppenderAttachedImpl.AppendLoopOnAppenders(LoggingEvent loggingEvent) 
    at log4net.Repository.Hierarchy.Logger.CallAppenders(LoggingEvent loggingEvent) 
    at log4net.Repository.Hierarchy.Logger.ForcedLog(Type callerStackBoundaryDeclaringType, Level level, Object message, Exception exception) 
    at log4net.Repository.Hierarchy.Logger.Log(Type callerStackBoundaryDeclaringType, Level level, Object message, Exception exception) 

不完全確定如何解決這個問題?

我已經讀過後臺線程,你可以設置IsBackground = true並且會銷燬worker,但是對我來說這似乎是在hangfire子系統中管理的。

我更關心的是從log4net中修復它還是以不同的方式編寫方法。在這一點上,這是測試項目,但在真實環境中,我不會直接調用log4net,它將被包裝在LoggingService中。對於這個測試,我只是試圖保持簡單。除非我沒有選擇。

回答

1

我想出了一些辦法。所以最初,Hangfire表和日誌表與系統中的表一起位於同一個數據庫中。我注意到在測試幾次,我會打連接字符串池錯誤。我並不真正擔心這個來自測試代碼的原因,因爲它會簡化版本的架構。無論如何,我的測試旨在錘擊數據庫來模擬數百萬筆交易。在這個測試中,我意識到要緩解一些錘擊,我應該將hangfire移動到它的DB上,這將節省連接字符串,並且移動一些db工作,同時這樣做也可以將日誌記錄移到它的DB中,這將再次將連接字符串保存在池中。

我說我偶然發現了這個,因爲當我決定這樣做時,我並沒有考慮記錄日誌。所以當我再次運行我的測試代碼時,我決定取消註釋我在hangfire執行的方法中的直接日誌記錄,並且按照我原本打算的方式運行時,我問了這個問題。長話短說,請記住,連接字符串運行在不同的線程上,分離數據庫提供了隱藏的線程優勢。這是一個非常模糊的測試應用程序,而不是代碼,我將在生產環境中運行,而不是我可以遇到同樣的問題。很快就會發現,因爲真正的拱門開發幾乎已經準備好進行測試。

相關問題