流式启动Spring Boot Web应用程序的日志消息

时间:2018-07-20 08:43:32

标签: spring-boot spring-amqp spring-websocket spring-logback

这个问题是关于我应该为该任务使用哪些工具的一般性建议,并可能向我介绍一些相关的教程。

我有一个Spring Boot Web应用程序,该应用程序在操作过程中会将日志消息生成到数据库中。此REST应用程序正在制作一个JavaScript管理工具,它的一项功能是实时显示日志消息。意思是,当用户在日志显示页面上时,他应该看到新的日志消息出现而无需刷新页面。

我的问题:

  • 在某些端点应如何为javascript客户端提供此功能?我现在正在看这些春季靴子入门:websocket,redis和amqp。我以前从未使用过这些。
  • 如何在应用程序内部生成日志消息时“捕获”它们?因此,我可以将它们与选定的解决方案一起发送给客户。

我并不是真正在寻找解决方案的定期查询,而是服务器在出现解决方案时推送数据。

感谢任何建议和代码示例。

1 个答案:

答案 0 :(得分:3)

将日志存储在数据库中通常不是一个好选择,除非您使用能够处理大量写请求的数据库,例如Apache Cassandra。但是,从数据库流数据并不是最直观的事情。

现代的替代方法是使用消息传递系统(例如Apache Kafka)将日志从生产系统流式传输到多个订阅系统。您可以通过多种方式实现这一目标。例如,对于从Spring Boot应用程序中流式传输日志,可以使用特殊的log4j附加程序(请参见here和示例here)。为了能够在Web浏览器中实时显示日志,您将需要另一个后端系统,该系统将从Kafka主题接收日志记录,并通过websocket将它们转发到JavaScript Web客户端,最有可能使用发布者/订阅者模型。

此外,您可以考虑使用服务器发送的事件(SSE)代替websocket。因为您只有一个单向消息流(日志是从后端系统流到浏览器中的javascript客户端,而没有相反的方式),所以SSE可以替代Websockets是一个不错的选择。 Websocket比SSE更难操作,并且通常在后端使用更多资源。与往常一样,您需要在权衡之间进行选择(请参见here)。