如何使用springboot在单个日志文件中记录所有微服务日志

时间:2019-12-06 09:22:57

标签: spring-boot microservices

我有5个使用Springboot(A,B,C,D和E)开发的Web应用程序。 以下是2个通话的流程

第一流:

A's Controllers --> A's Service --> B's Controller --> B'Service --> C's Controller --> C's Service --> C's Dao --> DB

SecondFlow:

A's Controllers --> A's Service --> D's Controller --> D'Service --> B's Controller --> B'Service --> C's Controller --> C's Service --> C's Dao --> DB

一旦从数据库中获取数据/将数据推送到数据库中,则相应的方法将返回一些值。对于记录状态的每种方法(输入详细信息和返回状态)。我能够分别在每个服务中查看日志。但是我想在一个文件中看到完整的一个 request-response(A的控制器请求到A的控制器响应)周期日志

我该如何实现?

2 个答案:

答案 0 :(得分:2)

这是一个非常糟糕的主意,但让我们退后一步,看看问题所在,而不是猜测解决方案。

您有多个应用程序可以协同协作以执行(分布式)事务。您需要跟踪这些交互以查看数据流。由于许多原因,这非常有用,因此您关心它是正确的。将所有日志条目收集在一个接收器中也是正确的,即使它不是一个文件,因为它也不适合管理生产工作负载。许多组织实施的典型方案如下

  1. 每个应用程序将日志发送到文件或标准输出
  2. 对于基础架构的每个节点,都有一个代理读取流,进行一些基本转换(例如,以通用格式转换日志条目)并将数据发送到某个接收器
  3. 接收器是一个数据库,最好的技术选择是一个DBMS,它对数据模式(毕竟,所有内容都存储在一个大表中)和事务属性(如果数据是日志,则没有任何严格要求)乐观并发控制)。您还希望有一种工具在读取方面胜于写入,并且在复杂的搜索中具有良好的性能,以深入挖掘大量结构化数据
  4. 一个仪表板,用于读取日志,进行搜索甚至创建带有有关事件的综合统计信息的仪表板

奖金:使用缓冲区来管理负载峰值

有精确的工具可以完成工作

  1. logstash / beats / fluentd
  2. Elasticsearch ....还有什么? ;)
  3. Kibana,最受欢迎的Elasticsearch客户 奖励:rabbimq / kafka / otherMessageBroker或Redis

但您仍然错过了一步

假设您调用REST API,就像POST / users /:userId / cart之类的简单

  1. API网关通过JWT接收您的请求
  2. API网关调用身份验证服务以验证和解码JWT
  3. API网关调用授权服务以检查客户端是否具有执行请求的权利
  4. API网关调用用户服务以查找:userId
  5. User-Service调用Cart-service将产品添加到:userId cart
  6. 购物车服务调用Notification-Service来决定是否需要为完成的任务发送通知
  7. Notification-Service调用Push-Gateway调用外部推送通知服务

....然后返回

为了不迷失在这个迷宫中,您只需要一件事:关联ID

  • 关联ID将唯一的ID附加到这些微服务(例如HTTP调用或AMQP消息中的标头)和自定义日志库之间的所有交互中,因为您已经构建了自定义日志库并在所有团队之间共享)捕获此ID,以将其包括在每个微服务处理的单个请求的上下文中编写的每个日志条目中。您甚至可以在客户端响应中添加该相关ID,如果响应执行错误代码则捕获该相关ID,并在日志数据库中执行查询以查找具有给定相关ID的所有条目。如果系统时钟正常工作,则会按正确的时间顺序进行检索,您将能够重建数据流

分布式系统使一切变得更加复杂,并增加了我们以前做过的事情的开销,但是如果您放下口袋来管理复杂性的正确工具,您将看到好处

答案 1 :(得分:0)

您可以实现中央记录系统,例如:

用于集中式日志记录的ELK堆栈(弹性搜索,Logstash和Kibana)。