Java Spring JTA事务的Log4J配置

Java Spring JTA事务的Log4J配置,java,spring,log4j,Java,Spring,Log4j,我们使用这个Log4J配置来显示JTA信息: <category name="org.springframework.transaction"> <priority value="DEBUG"/> </category> 。。。现在,我们使用Spring的MessageListener来侦听MQ队列。问题是这是事务性的,我们每2秒打印一次上面提到的日志 我们想要的是,当有人使用我们的RESTAPI访问利用@Transactional的服务时,将这些J

我们使用这个Log4J配置来显示JTA信息:

<category name="org.springframework.transaction">
    <priority value="DEBUG"/>
</category>
。。。现在,我们使用Spring的
MessageListener
来侦听MQ队列。问题是这是事务性的,我们每2秒打印一次上面提到的日志

我们想要的是,当有人使用我们的RESTAPI访问利用
@Transactional
的服务时,将这些JTA日志语句打印出来。我们不需要来自这个“轮询”MQ侦听实现的JTA日志条目


您可以这样做吗?

您应该在配置中将默认日志级别设置为高于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侦听器发起的调用也会被记录,但AFAIK无法根据调用的位置为同一类配置不同的日志级别:-(


更新:另一种可能是创建自定义TransactionManager,它只是Spring提供的一个包装器。它将调用转发到Spring并编写自己的日志。您可以在API中使用它,但在MQ侦听器中使用Spring版本。然后您将有两个不同的类,以便可以设置不同的日志级别。我相当肯定这是可能的,但是配置和维护可能会比它的价值更麻烦…

您应该在配置中将默认日志级别设置为高于调试的级别,然后尝试在相应的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侦听器发起的调用也会被记录,但AFAIK无法根据调用的位置为同一类配置不同的日志级别:-(


更新:另一种可能是创建自定义TransactionManager,它只是Spring提供的一个包装器。它将调用转发到Spring并编写自己的日志。您可以在API中使用它,但在MQ侦听器中使用Spring版本。然后您将有两个不同的类,以便可以设置不同的日志级别。我很确定这是可能的,但是配置和维护可能会比它的价值更麻烦…

我猜您使用的是
DefaultMessageListenerContainer
,对吗?这会主动轮询JMS队列,创建恒定的事务流

有一件事你可以尝试,我不愿意提出,但是你可以考虑使用<代码> SimpleMessageListenerContainer <代码>。这不支持JMS,它依赖于JMS来传递消息给它。这更简单(因此命名)。,但在某些JMS设置中可靠性较低。由于它更被动,因此会产生较少的事务负载,从而减少日志噪音


我不太愿意提出建议,因为更改设计以减少日志噪音可能不是一个好主意。

我猜您使用的是
DefaultMessageListenerContainer
,对吗?这会主动轮询JMS队列,创建恒定的事务流

有一件事你可以尝试,我不愿意提出,但是你可以考虑使用<代码> SimpleMessageListenerContainer <代码>。这不支持JMS,它依赖于JMS来传递消息给它。这更简单(因此命名)。,但在某些JMS设置中可靠性较低。由于它更被动,因此会产生较少的事务负载,从而减少日志噪音


我不太愿意提出建议,因为更改设计以减少日志噪音可能不是一个好主意。

这是一个不错的解决办法……假设我要寻找的是您所说的不可用的内容——根据从Custom
TransactionManager调用的位置为同一类配置不同的日志级别是一个不错的主意。就像你说的,可能比它的价值更麻烦..这是一个不错的解决办法…假设我要找的是你说的不可用--根据从Custom
TransactionManager
调用的位置为同一类配置不同的日志级别是一个好主意。就像你说的,可能比它的价值更麻烦..我们的类实现了
MessageListener
。这是我所知的范围。显然似乎是轮询。使用
SimpleMessageListenerContainer
听起来是个好主意。但是正如您所提到的,不确定我们是否要更改设计。我们已经在其他项目上成功地使用了当前方法,我不确定是否要尝试som这是新的,只是为了更方便的日志记录选项。@Marcus:这可能是明智的。顺便说一句,
MessageListenerContainer
是将应用程序的
MessageListener
链接到JMS的粘合逻辑Spring组件。我们的类实现了
MessageListener
。这是我所知的范围。显然是进行轮询。使用
SimpleMessageListenerContainer
听起来是个好主意。但正如您所说,不确定我们是否要更改我们的设计。我们已经在其他项目上成功地使用了当前的方法,不确定我是否想尝试一些新的方法,只是为了更方便的日志记录选项。@Marcus:这可能是明智的。顺便说一句,
MessageListenerContainer
是将应用程序的
MessageListener
链接到JMS的粘合逻辑Spring组件。