如何在所有执行上下文中的play框架日志中记录请求ID

use*_*976 8 java logging logback playframework playframework-2.0

我们有一个巨大的遗留代码,复杂的流程具有同步和异步操作.因此,我们需要在所有日志消息中记录特定请求的唯一ID,其中执行的操作在不同的线程中运行,并且线程在多个执行上下文中.

我尝试使用MDC并在logger.xml中指定 - %X {req_id}并使用自定义akka调度程序在下面提到的博客中给出解决方案,但它不能在多个执行上下文中工作,并且它在单次执行中也不能可靠地工作上下文,有时它返回req_id null.(http://yanns.github.io/blog/2014/05/04/slf4j-mapped-diagnostic-context-mdc-with-play-framework/)

由于复杂而庞大的代码库,因此无法在每个函数调用中传递请求ID.我们有什么方法可以实现这一目标,但变化最小?我们在play框架生成的日志中也需要该请求id.

hru*_*esh 0

我有同样的需要,记录一些跟踪令牌以进行调试。Kamon 库已经具有此功能 http://kamon.io/integrations/logback/trace-token-converter/。

在我的 Global.java 中:我Kamon.start()在 onStart() 中执行操作并在 onRequest() 中维护上下文。还可以使用traceTokenin 日志记录模式。

public Action onRequest(Http.Request request, Method actionMethod) {
  TraceContext tx = Kamon.tracer().newContext("reqc", new Some<>(Utils.randStr(8)));
  Tracer.setCurrentContext(tx);
  Logger.info("Request: " + request.toString());
  Action x = super.onRequest(request, actionMethod);
  tx.finish();
  return x;
}
Run Code Online (Sandbox Code Playgroud)