Java 如何跨所有执行上下文在play framework日志中记录请求Id

Java 如何跨所有执行上下文在play framework日志中记录请求Id,java,logging,playframework,playframework-2.0,logback,Java,Logging,Playframework,Playframework 2.0,Logback,我们有一个庞大的遗留代码,具有复杂的同步和异步操作流。因此,我们需要在所有日志消息中记录特定请求的唯一id,其中执行的操作在不同的线程中运行,并且线程在多个执行上下文中 我尝试使用MDC,在logger.xml中指定-%X{req_id},并使用自定义akka dispatcher在下面提到的博客中给出的解决方案,但它在多个执行上下文中不起作用,在单个执行上下文中也不可靠,有时它返回req_id null。 () 由于复杂且庞大的代码库,不可能在每个函数调用中传递请求id。我们有没有办法在最少的

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

我尝试使用MDC,在logger.xml中指定-%X{req_id},并使用自定义akka dispatcher在下面提到的博客中给出的解决方案,但它在多个执行上下文中不起作用,在单个执行上下文中也不可靠,有时它返回req_id null。 ()


由于复杂且庞大的代码库,不可能在每个函数调用中传递请求id。我们有没有办法在最少的变化下实现这一目标?我们也需要在play framework生成的日志中记录该请求id。

我也有同样的需要,记录一些跟踪令牌以进行调试。Kamon library已经具有此功能

在我的Global.java中:我在onStart()中执行
Kamon.start()
,并在onRequest()中维护上下文。在日志模式中也使用
traceToken

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;
}
onRequest公共操作(Http.Request-Request,Method-actionMethod){
TraceContext tx=Kamon.tracer().newContext(“reqc”,新的一些(Utils.randStr(8));
Tracer.setCurrentContext(tx);
Logger.info(“请求:+Request.toString());
Action x=super.onRequest(请求,actionMethod);
tx.finish();
返回x;
}

我们通过转移到单执行器上下文解决了这个问题,play 2.5也建议这样做。在这种情况下,mdc上下文将起作用。

您应该能够使用。从示例中可以看出:

trait RequestMarkerContext {

  // Adding 'implicit request' enables implicit conversion chaining
  // See http://docs.scala-lang.org/tutorials/FAQ/chaining-implicits.html
  implicit def requestHeaderToMarkerContext(implicit request: RequestHeader): MarkerContext = {
    import net.logstash.logback.marker.LogstashMarker
    import net.logstash.logback.marker.Markers._

    val requestMarkers: LogstashMarker = append("host", request.host)
      .and(append("path", request.path))

    MarkerContext(requestMarkers)
  }

}
然后

def asyncIndex = Action.async { implicit request =>
  Future {
    methodInOtherExecutionContext() // implicit conversion here
  }(otherExecutionContext)
}

def methodInOtherExecutionContext()(implicit mc: MarkerContext): Result = {
  logger.debug("index: ") // same as above
  Ok("testing")
}

但onRequest()并非在所有执行上下文中都可用。根据我的理解,我说的对吗?
onRequest()
仅在提出请求时可用。同样,在所有其他上下文中,您必须创建并完成
TraceContext
。所以您解决了它,但如何解决?因为这只是一个评论而不是一个解决方案!在application.conf中,必须定义不同的执行上下文。只是不要用一个,我现在没有conf文件的副本。