我在 Cloud Foundry 上部署了一些 spring-boot 微服务,并且我必须实现它们发出的业务审计事件的传播和存储(到存储库)。
我可以通过几种方式来做到这一点,例如:
Source
(Spring Cloud Stream
/ RabbitMQ)上,并由Sink
服务使用,以将事件写入存储库中。log-consuming service
过滤并将其写入存储库来使用它。internal CF's mechanism
作为新的自定义log type
或自定义audit event
发布审核事件-我认为此选项不是一个好主意,但我可能是错的... 在Cloud Foundry平台上是否有建议的方法/模式来实现此问题?
编辑
(我认为)所有方法都符合12-factor规则,但是每种方法都有其优点和缺点:
+
确保交付(事件不会丢失)+
允许使用路由(RabbitMQ)-
需要连接到消息代理(不像记录器那样简单)+
很简单-
日志可能会丢失-
审计业务信息广泛传播-GDPR -
可能会强制更改CF 答案 0 :(得分:1)
我将用一个问题回答您的问题。您的“业务审核日志”到底是什么?如果您丢失了其中一些会不会有问题?
如果答案是是,并且丢失单个日志也是不可接受的,那么我可以证明它们不是真正的日志,而是业务记录(也许看起来像日志)。在这种情况下,请将记录存储在有存储空间的数据库或其他服务中。这是额外的工作,但是您需要确保正确存储这些记录,以确保进行额外的工作。
如果答案为否,并且丢失部分甚至全部日志(为最坏的情况做计划)是可以接受的,那么我建议只将它们写入STDOUT。 Cloud Foundry将为您处理这些日志的路由,因此非常容易。如果要将系统日志流发送到消耗日志的服务,则可以绑定系统日志流失,也可以实现Loggregator Nozzle并直接从CF中读取日志。从应用程序的角度来看,这并不重要,您甚至可以稍后改变主意,而无需更新应用程序。
希望有帮助!
答案 1 :(得分:0)
在我的应用程序中,我坚持使用12 factor application规则。
第11条规则是: Treat logs as event streams
这是有关日志记录的重要部分:
十二要素应用程序从不关心路由或存储 它的输出流。它不应尝试写入或管理 日志文件。相反,每个正在运行的进程都写入其事件流, 无缓冲,到标准输出。在本地开发期间,开发人员将 在其终端的前台查看此流,以观察 应用的行为。
在登台或生产部署中,每个流程的流将是 由执行环境捕获,并与所有 应用中的其他流,并路由到一个或多个最终流 观看和长期存档的目的地。这些档案 应用程序看不到目的地或无法配置目的地,并且 而是完全由执行环境进行管理。 开源日志路由器(例如Logplex和Fluentd)可用 为此目的。
因此,建议的方法是将日志写入stdout。