2012-02-21 84 views
5

我正在使用slf4j進行登錄。有時日誌不按順序打印(時間戳)。 我們是否可以強制它按照代碼運行的順序登錄?強制slf4j按順序打印日誌

更新1:通過maven在Jenkins上運行單元測試時發生這種情況。它一直在發生。來自代碼的第一個日誌語句即將到來,然後來自單元測試的日誌語句即將到來。

此外,所有的logback文件看起來像下圖一樣正常。

<appender name="STDOUT" 
      class="ch.qos.logback.core.ConsoleAppender"> 
    <layout class="ch.qos.logback.classic.PatternLayout"> 

更新2:日誌片段是這樣的(我曾經編輯過的文件名等)。在test1執行過程中,我們調用代碼來反轉由於某種錯誤而失敗的事務。 但奇怪的是,首先打印異常,然後打印來自測試方法的日誌語句。同時日誌報表的時間戳是作爲預期,但他們的文件中的順序是不同的(14時33分34秒。談到14時33分34秒之前。)

14:33:34.667 [[email protected]] [] WARN org.hibernate.ejb.Ejb3Configuration - hibernate.connection.autocommit = false break the EJB3 specification 
14:33:34.718 [[email protected]] [] WARN o.h.impl.SessionFactoryObjectFactory - InitialContext did not implement EventContext 
14:33:34.843 [[email protected]] [] DEBUG c.r.a.exception.ExceptionMapper - <3003> can't reverse transaction. [id=10000000100120014] 
. 
. 
. 
. 
. 
14:33:34.158 [main] [] DEBUG c.r.a.test - ========================= test0: finished. 
14:33:34.158 [main] [] DEBUG c.r.a.test - ========================= test1: started. 
. 
. 
. 
. 
14:33:34.449 [main] [] DEBUG c.r.a.test - reversing transaction, id=10000000100120014 
14:33:34.856 [main] [] DEBUG c.r.a.test - ========================= test2: started. 

更新3:我們的項目使用maven,並且有多個模塊。我們在src/test/resources文件夾中有logback-test.xml

項目結構如下
codemodule/src/test/resources/logback-test.xml - 該模塊將打包成jar文件。測試用例調用這個模塊的代碼。
parent/src/test/resources/logback-test.xml - 這是將所有其他模塊的jar文件和包裹打包成戰爭的父模塊。這是我測試用例運行的地方,它調用了上面的模塊代碼。

我在測試用例代碼和實際代碼中都有日誌語句。我已經檢查過,測試用例和代碼都使用來自父代的logback文件的模式(codemodule中的模式不同)。 它在打印測試用例的日誌之前始終打印代碼的日誌語句。

另外我們沒有並行運行測試。
Concurrency config is parallel='none', perCoreThreadCount=true, threadCount=2, useUnlimitedThreads=false

更新4:我理解這個問題。我們正在製作一個http請求,而不是直接的方法調用。所以測試用例在main線程中運行,而實際的代碼正在另一個線程中運行(謝謝Sebbe)。

據我所知,強制排序順序可能會影響性能,但對於問題的完整性,我會再問一個問題。

既然這兩個日誌都將單個appender(標準輸出),我可以強制它登錄的時間戳順序?

+0

你是說在你的日誌中看到消息混合時間戳(而不是增長?)從來沒有見過這樣的現象。你使用哪個appender? – 2012-02-21 12:13:16

+0

@TomaszNurkiewicz是的,我正在使用ch.qos.logback.core.ConsoleAppender – Reddy 2012-02-21 12:16:12

+0

你使用任何併發?這可能是一個原因。另外,你能否提供日誌摘錄 – Fixpoint 2012-02-23 16:48:12

回答

2

從你的日誌本身你可以看到你至少有2個線程在運行: [email protected]main

你不能控制單獨的線程將它們的事件記錄到同一個輸出的順序(你可能可以,但這是一個壞主意)。

從您的日誌線程[email protected]首先獲得對您的控制檯的寫入權限。在寫入時,事件記錄從main。一旦[email protected]釋放它的鎖,main得到它,它可以刷新它的日誌到文件。

+0

謝謝Sebbe,那可能是問題所在。但是我仍然需要檢查它爲什麼會一直髮生,以及來自「869082978 @ qtp-1587505558-0」的地方。 – Reddy 2012-02-28 09:27:56

+0

我有問題,但有另一個問題。更新(#4)問題。 – Reddy 2012-03-01 05:53:22