2010-03-09 81 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