跟踪服务之间的呼叫的方法

时间:2016-03-17 16:10:55

标签: java web-services logging logback

我正在开发几种通过HTTP相互通信的Java服务。 Logback用作日志框架。

如果在一个服务中出现错误,则通过服务日志定义错误原因并不困难。但是,如果我们有一个影响许多服务的下游呼叫:

服务A - >服务B - >服务C - >服务D

并且上次服务因错误而失败,我需要一些方法来跟踪调用服务A 以解决问题。

这个问题有没有现成的解决方案?我是否应该为每个下游呼叫添加一些唯一的日志消息属性?

2 个答案:

答案 0 :(得分:1)

如果要跟踪执行流程,则需要在每条消息上添加某种标记。你需要:

  • 请求标识符
  • 服务标识符。

当流程开始时,您使用请求标识符和服务标识符标记第一个呼叫。在处理呼叫并需要进行其他呼叫的每个服务上,保留请求标识符并将当前服务标识符添加到您收到的请求之一。

基本上,请求标识符允许您标识呼叫流,而服务标识符允许您查看流中的跃点。

对于您的示例,服务A - >服务B - >服务C - >服务D ,您可能会遇到以下情况:

  1. 服务A开始通话" 123-A";
  2. 服务B收到此信息并需要拨打服务C,因此它使用" 123-A"和广告他的标识符:" 123-A,B&#34 ;;
  3. 服务C收到此消息并需要拨打服务D,因此它使用" 123-A,B"和广告他的标识符:" 123-A,B,C&#34 ;;
  4. 如果服务D中的请求出现问题,您就知道要查看的服务日志(A,B,C)以及要查找的内容(123)。
  5. 您可以在HTTP消息中或作为HTTP标头中使用这些内容,我们的想法是在您记录某些内容时以某种方式将它们添加到日志消息中。

    当然,上面是一个简单的案例,就像你给出的一个例子,因此它可以扩展到其他案例。我们的想法是将调用视为一种堆栈。在每一跳上你都会推动"一些识别信息。

答案 1 :(得分:0)

实际上有一种基于弹簧服务的解决方案:request correlation spring cloud starter

过滤器将唯一请求标识符添加为每个请求的标头(如果没有此类标头)。可以将id放到MDC并将其添加到具有服务ID的日志条目中。