我在CloudFoundry上部署了一些spring-boot微服务,我必须实现传播并存储(到存储库(它们发出的业务审计事件。
我可以用几种方法来做,例如:
- 将审核事件发布到
Source
(Spring Cloud Stream
/RabbitMQ(,并由Sink
服务将事件写入存储库来使用它 - 将审核事件发布为自定义应用程序日志,并通过
log-consuming service
筛选并将事件写入存储库来使用它 - 使用
internal CF's mechanism
作为新的自定义log type
或自定义audit event
发布审核事件-我认为这个选项不是个好主意,但我可能错了
有什么推荐的方法/模式可以在Cloud Foundry平台上实现这个问题吗?
编辑
所有的方法都符合(在我看来(12因素规则,但每种方法都有其优缺点:
-
(1(春云流
+
确保交付(事件不会丢失(+
允许使用路由(RabbitMQ(-
需要连接到消息代理(不像记录器那么简单(
-
(2(日志消耗服务
+
很简单-
日志可能丢失-
审计biznes信息传播太广-GDPR
-
(3(新CF的日志类型
-
可能会迫使CF发生变化
我要用一个问题来回答你的问题。您的"业务审核日志"究竟是什么?如果你丢了一些会有问题吗?
如果答案是是,并且丢失哪怕一个日志都是不可接受的,那么我会认为它们不是真正的日志,而是业务记录(可能只是看起来像日志(。在这种情况下,将记录存储在保证存储的数据库或其他服务中。这是一项额外的工作,但你需要确保这些记录被正确存储,这样额外的工作是有保证的。
如果答案是no,并且丢失部分甚至全部(为最坏的情况做好计划(这些日志是可以接受的,那么我建议将它们写入STDOUT。Cloud Foundry将为您处理这些日志的路由,因此非常简单。如果你想将syslog drain发送到日志消耗服务,你可以绑定它们,或者你可以实现Logcollector喷嘴,直接从CF读取日志。从应用程序的角度来看,这并不重要,你甚至可以稍后改变主意,不需要更新你的应用程序。
希望能有所帮助!
在我的应用程序中,我坚持使用12因素应用程序规则。
第11条规则是:将日志视为事件流
这是关于日志的重要部分:
一个十二因素应用程序从不关心路由或存储其输出流。它不应该试图写入或管理日志文件。而是每个正在运行的进程写入其事件流,没有缓冲,到stdout。在当地开发期间,开发商将在终端的前景中查看此流,以观察应用程序的行为。
在暂存或生产部署中,每个流程的流将由执行环境捕获,并与所有来自应用程序的其他流,并路由到一个或多个最终流查看和长期存档的目的地。这些档案目的地对应用程序不可见或不可配置,以及而是完全由执行环境管理。提供开源日志路由器(如Logplex和Fluentd(为此目的。
因此,建议的方法是将日志写入stdout。