集中日志记录 - 关联服务器之间的消息

时间:2013-04-03 14:33:01

标签: java logging log4j javaagents logstash

我们有一个非常分散的系统。网站上的用户请求可能涉及对多个服务的调用。例如,当用户登录该站点时,调用广告服务,个性化服务,相关新闻服务等来构建登录时显示所需的数据。高级设计:对URL的请求被映射到Spring MVC Controller,并且该控制器将调用(大多数使用HttpClient)发送到不同的服务。

我们正在使用Logstash,ElasticSearch,Kibana,Log4j / SLF4J实施集中式日志解决方案。当在站点上报告问题时,我们希望能够将日志级别更改为调试并查看所有服务中特定请求的日志消息。我们在Log4j MDC中填充请求ID,因此我们能够在webapp服务器上识别该特定请求的日志消息。如何关联来自对其他服务的调用的消息?

流速: 用户登录 - >请求映射到Spring MVC Controller,它通过在Log4j MDC中填充请求ID来记录消息 - > http客户端调用service1,service2,service 3

如何将来自service1,service2,service3的消息与MVC控制器记录的消息相关联。一种解决方案是在http客户端调用中传递请求ID。有很多应用程序遵循这种模式,因此在任何地方更改代码都不是理想的解决方案。

UPDATE1:

我不太了解jvm代理,但我想知道是否可以开发自定义代理来拦截网络调用并添加参数。接收方的客户代理将检测参数将其添加到ThreadLocal变量。 Dynatrace PurePath技术以某种方式关联跨JVM的调用 - 它们需要注入他们的jvm代理,所以我猜他们正在拦截代理中的调用。看看这个video

1 个答案:

答案 0 :(得分:1)

您将不得不咬紧牙关并将请求ID添加到HTTP客户端调用。如果您不想污染您的API,请将其添加为自定义HTTP标头,然后使用服务端的某种HTTP拦截器(取决于您正在使用的Web服务堆栈)将其解压缩,然后重新添加它到MDC。