如何使用logback和slf4j为每个事务分配唯一的id

时间:2016-07-14 15:13:57

标签: java-ee logback slf4j

我正在使用spring framework,jersey framework开发一个电子商务企业j2ee应用程序。目前,我们正在记录所有事务(通过使用队列中的消息/通过Web服务请求创建的事务)。

可以说,我在组件中处理时有一条消息失败。我想获取该事务的所有日志(所有日志级别信息,调试,错误...)。目前我正在查看线程名称以确定该事务的所有日志。我不想长期依赖它,因为在某个时间点之后线程名称可能是相同的。

  

2016-07-14 02:45:50,716 [DefaultMessageListenerContainer-3] DEBUG   SomeClass - someMethod1() - 方法条目

     

2016-07-14 02:45:50,724 [DefaultMessageListenerContainer-3]   SomeClass1 - someMethod2()插入的行数:[1]

     

2016-07-14 02:45:50,724 [DefaultMessageListenerContainer-3] DEBUG   SomeClass - someMethod1() - 方法退出

我是否有可能拥有类似这样的日志

  

2016-07-14 02:45:50,716 [sometransactionnbr]   [DefaultMessageListenerContainer-3] DEBUG SomeClass - someMethod1() -   方法录入

     

2016-07-14 02:45:50,724 [sometransactionnbr]   [DefaultMessageListenerContainer-3] SomeClass1 - someMethod2()编号   插入的行:[1]

     

2016-07-14 02:45:50,724 [sometransactionnbr]   [DefaultMessageListenerContainer-3] DEBUG SomeClass - someMethod1() -   方法退出

如何在不改变我编写的每种方法的代码的情况下轻松添加“sometransactionnbr”?

1 个答案:

答案 0 :(得分:3)

可悲的是,没有快速变化......

首先,您需要使用映射的诊断上下文(MDC)来设置 transactionID 。此实用程序类允许设置与已执行的操作相关的上下文信息(您可以设置任何有助于您以更清晰的方式审核日志的信息)。

理想情况下,您的 transansationID 必须在操作开始时设置(业务方法)并在结束时删除。配置完成后,transactionID可用于任何已记录的事件(即使这些事件是通过内部方法调用记录的。因此您不需要将此类信息传递给内部方法......记录器将为您管理此事件。) / p>

非常重要:MDC将上下文链接到执行MDC.put()方法的线程...因此,如果您的应用服务器正在重用线程(大多数都是这样做),你没有正确地清理上下文,你将使用过时的上下文(那个先前在同一个线程执行的上下文)记录事件...而且,上下文将是一个线程的本地,所以如果你正在调用另一个方法在另一个线程执行,这样的上下文信息将不会被转移!!!(在这种情况下,您将需要以另一种方式传递此类信息)。

其次,您必须修改记录器配置以将此上下文参数包含到您的模式中....示例:

%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c] [%X{txID}] (%t) %m%n

%X从MDC检索参数。

希望这有帮助...

更新:使用示例...

public class MyBusinessClass {
    private static TxIDGenerator generator = new TxIDGenerator();
    ...
    public void myBusinessMethod() {
        String txID = generator.nextValue();
        MDC.put("txID", txID);
        try {
            businessStuffA();
            businessStuffB();
            ...
            //some business stuff
        } finally {
            MDC.remove("txID");
        }
    }
}