现在我的同事从事日志子系统的工作,他们想要绑定(bind)从某些业务方法启动的单独操作。例如,如果 bean A 中的方法调用 bean B 中的某个方法,然后在 bean C 中调用某个方法,那么了解 bean B 中的业务方法会很棒,而 bean C 会为 bean A 中的方法做一些工作。尤其是很棒的是知道 B 和 C 的方法为 bean A 的具体调用完成了一些工作单元。
那么,问题是如何将这些工作单元联系起来?显然,使用方法参数进行绑定(bind)并不美观!
而且我认为是时候问另一个问题了,这个问题与上一个问题足够接近。如果我想将一些上下文信息从 bean A 传播到另一个从 A 调用的 beans 怎么办?安全凭证和安全主体之类的东西?我能做什么? 可能是我问的问题是某种不好的做法?
最佳答案
看起来是 mdc 的一个很好的用例, Logback 均可用和 Log4J .本质上,您是将一些自定义值附加到线程,并且来自该线程的所有日志消息都可以将该值附加到消息。
我认为在 EJB 中实现它的最佳方式是 interceptor :
public class MdcInterceptor {
@AroundInvoke
public Object addMdcValue(InvocationContext context) throws Exception {
MDC.put("cid", RandomStringUtils.randomAlphanumeric(16));
try {
return context.proceed();
} finaly {
MDC.remove("cid");
}
}
}
现在你所要做的就是添加:
%X{user}
到您的日志记录模式(logback.xml
或 log4j.xml
)。
另见
关于java - EJB3 相关 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9353532/