Java 如何跨所有执行上下文在play framework日志中记录请求Id
我们有一个庞大的遗留代码,具有复杂的同步和异步操作流。因此,我们需要在所有日志消息中记录特定请求的唯一id,其中执行的操作在不同的线程中运行,并且线程在多个执行上下文中 我尝试使用MDC,在logger.xml中指定-%X{req_id},并使用自定义akka dispatcher在下面提到的博客中给出的解决方案,但它在多个执行上下文中不起作用,在单个执行上下文中也不可靠,有时它返回req_id null。 ()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。我们有没有办法在最少的变化下实现这一目标?我们也需要在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文件的副本。