我正在使用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”?
答案 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");
}
}
}