记录多个组件中的全局ID

时间:2009-11-09 14:50:12

标签: java logging jms spring-integration

我有一个系统,它包含使用JMS和Spring Integration连接在一起的多个应用程序。消息将通过一系列应用程序发送。

[App A] - > [应用B] - > [App C]

我们在邮件头中设置了一个全局ID,以便我们可以通过系统跟踪每个邮件生命周期。

我希望能够在系统中添加消息全局标识的任何日志消息。

还有其他人这样做过吗?有没有办法将此变量与Thread相关联,以便我可以在以后的方法中访问它?我宁愿不在系统的方法中传递变量。

4 个答案:

答案 0 :(得分:2)

我认为ThreadLocal可能就是你想要的,虽然有些人可能会发现这种方法滥用了ThreadLocal的目的或良好的设计。类似的东西:

public class MyIDManager {
  public static final ThreadLocal<Long> myID = new ThreadLocal<Long>();
}

...
// set ID at some point
MyIDManager.myID.set(theNewID);

...
// read it later
long currentID = MyIDManager.get();

这里的神奇之处在于myID的值实际上是特定于Thread的,并且在从不同的线程访问时会有所不同。

然后,您可以使用ID执行您喜欢的操作,包括记录它。

答案 1 :(得分:1)

Thread t = Thread.currentThread();
t.setName("Your ID Here");

答案 2 :(得分:0)

我认为第一篇文章提到的另一个答案是简单地要求您的日志框架在日志语句中包含线程名称。例如,log4j允许您在PatternLayout中添加带有't'的线程名称:http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html我也在其他框架中看到了这一点。

答案 3 :(得分:0)

BTW,这种方法是更广泛的企业日志记录模式的一部分。我试图记录这种模式here。摘要是:

  

TL; DR

     

最早创建一个'进程',创建一个ID   'origin id'和'unique id'的组合。这非营业   相关的全局初始ID(GIID)应该用于每个日志   输出,以提供机器可读性和工具使用。当每个新的   获得或生成业务级别或操作ID,它是   记录以提供与此GIID的“关联”。这类似于   各种现有的实践,因此它被呈现为软件设计   图案。