2010-03-09 82 views
0

我們用這個Log4J的配置顯示JTA信息:Log4J的配置爲Spring JTA事務

<category name="org.springframework.transaction"> 
    <priority value="DEBUG"/> 
</category> 

生成的日誌條目類型:

15:36:08,048 DEBUG [JtaTransactionManager] [ ] Creating new transaction with name [class]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT 
15:36:09,564 DEBUG [JtaTransactionManager] [ ] Initiating transaction commit 

...現在我們使用Spring的MessageListener監聽MQ隊列。問題是這是事務性的,我們每2秒打印一次前面提到的日誌記錄。

我們想要的只是當有人使用我們的REST API訪問利用@Transactional的服務時,打印出這些JTA日誌語句。我們不希望來自此「輪詢」MQ偵聽實現的JTA日誌條目。

你能做到這一點?

回答

2

您應該在您的配置中將默認日誌級別設置爲高於DEBUG,然後嘗試在相應調用中的REST API中手動調整org.springframework.transaction的日誌級別。

public void doSomething() { 
    Logger txLogger = Logger.getLogger("org.springframework.transaction"); 
    Level defaultLevel = txLogger.getLevel(); 
    txLogger.setLevel(Level.DEBUG); 
    // do my stuff 
    txLogger.setLevel(defaultLevel); 
} 

這意味着,在調用您的API中 - 但只有 - 由MQ監聽器發出的呼叫也將被記錄,但據我所知是沒有辦法爲依據同一類配置不同的日誌級別它是從哪裏叫:-(

更新:另一種可能性是創建一個自定義事務管理,這將是隻爲Spring提供了一個的包裝它將着春天的,寫出了自己。你可以在你的API中使用它,但在MQ監聽器中使用Spring版本,那麼你將有兩個不同的類,所以你可以設置不同的日誌級別。相當肯定這是可能的,但它可能會更麻煩的配置和維護比它的價值...

+0

這是一個體面的解決方法...假設我正在尋找的是你所說的不可用 - 爲同一類配置不同的日誌級別,取決於從 – 2010-03-09 20:56:22

+0

調用的位置自定義「TransactionManager」是一個很好的理念。就像你說的,可能比它的價值更麻煩.. – 2010-03-10 14:13:06

1

我猜你正在使用DefaultMessageListenerContainer,是嗎?這會主動輪詢JMS隊列,創建一個持續的事務流。

有一件事你可以嘗試,我猶豫建議它,但你可以考慮使用SimpleMessageListenerContainer來代替。這不會輪詢JMS,它依賴於JMS將消息傳遞給它。這更簡單(因此名稱),但在一些JMS設置中不太可靠。由於它更加被動,它會產生更少的事務負載,從而減少日誌噪音。

我不願意提出這個建議,因爲改變你的設計以減少對數噪音可能不是一個好主意。

+1

我們的類實現'MessageListener'。這是我的知識程度..絕對似乎是投票。使用'SimpleMessageListenerContainer'聽起來像是一個好主意..但正如你所提到的,不知道我們是否想改變我們的設計。我們已經在其他項目上成功地使用了當前的方法,但並不確定我想嘗試一些新的東西,只是爲了更方便的日誌記錄選項。 – 2010-03-10 14:15:11

+0

@Marcus:這可能是明智的。順便提一句,MessageListenerContainer是將應用程序的MessageListener鏈接到JMS的粘合邏輯Spring組件。 – skaffman 2010-03-10 14:43:23