Java 跟踪服务间调用的方法

Java 跟踪服务间调用的方法,java,web-services,logging,logback,Java,Web Services,Logging,Logback,我正在Java上开发几个通过HTTP相互通信的服务。Logback用作日志框架 在一个服务中发生错误的情况下,通过查看服务日志来定义错误原因并不困难。但如果我们有一个下游呼叫,它会影响许多服务: 服务A->服务B->服务C->服务D 最后一个服务由于错误而失败,我需要一些方法来跟踪调用服务A,以解决问题 这个问题有现成的解决办法吗?我是否应该为日志消息添加一些对于每个下游调用都是唯一的附加属性?如果要跟踪执行流,则需要在每条消息上添加某种标记。您将需要: 请求标识符 服务标识符 当流启动时,

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

在一个服务中发生错误的情况下,通过查看服务日志来定义错误原因并不困难。但如果我们有一个下游呼叫,它会影响许多服务:

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

最后一个服务由于错误而失败,我需要一些方法来跟踪调用服务A,以解决问题


这个问题有现成的解决办法吗?我是否应该为日志消息添加一些对于每个下游调用都是唯一的附加属性?

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

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

基本上,请求标识符允许您标识调用流,而服务标识符允许您查看流中的跳数

对于您的示例,服务A->服务B->服务C->服务D,您可能有如下内容:

  • 服务A启动呼叫“123-A”
  • 服务B收到此消息,需要调用服务C,因此它使用“123-a”并显示其标识符:“123-a,B”
  • 服务C收到此消息,需要调用服务D,因此它使用“123-a,B”并显示其标识符:“123-a,B,C”
  • 如果服务D中的请求发生了问题,您知道要查看哪些服务日志(A、B、C)和要查找哪些服务日志(123)
  • 您可以将它们放在HTTP消息中,也可以作为HTTP头,这样做的目的是在您记录某些内容时以某种方式将它们添加到日志消息中


    当然,上面的例子是一个简单的例子,所以它可以扩展到其他情况。其思想是将调用视为一种堆栈。在每个跃点上,您都会将一些标识“推”到消息中。

    基于spring的服务实际上有一个解决方案:


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

    非常感谢!我找到了与你的建议相似的现成解决方案。