如何在 cqrs 上下文中正确处理日志记录?

Posted

技术标签:

【中文标题】如何在 cqrs 上下文中正确处理日志记录?【英文标题】:How is logging properly handled in cqrs context? 【发布时间】:2013-07-11 20:15:02 【问题描述】:

我试图弄清楚如何处理登录 CQRS 设置。情况如下:

我有一个基于 Rx 的事件代理。 我有一个项目Foo.Events,其中事件从EventArgs 继承(不知道为什么),因此代理希望所有事件都从此类继承。 我有几个子系统(使用 DI 初始化)发布到日志中。 我需要几个子系统来处理日志记录请求并相应地处理它们(显示在屏幕上,发送 xmpp/sms/whatever)

现在,我正试图弄清楚如何适应登录。在 CQRS 中,在我看来,日志记录本身并不是一个事件,而是系统对事件的响应。另一方面,日志请求看起来像一个命令,即 CQRS 中的 C。

我很想以某种方式将其放入事件代理中,但我不确定。无论如何,命令是否属于事件代理,我们是否可以假设代理只是一些消息系统,并不真正关心它是 C 还是 Q?

非常感谢您的帮助!

【问题讨论】:

【参考方案1】:

日志记录是一个基础设施问题。命令和事件(通常)与业务相关。记录只会在必要时进行,技术实施取决于您。它既不是命令也不是事件。它记录其中之一已经发生。事实上,您甚至可能想要记录某些查询。

您可以将事件存储在事件日志中(甚至在事件存储中)并将它们用作日志。如果您需要记录命令和/或某些查询,您还可以使用日志处理程序包装您的命令和查询处理程序。

【讨论】:

【参考方案2】:

日志在不同的上下文中以不同的方式表现出来。在 CQRS 中,领域事件的存储可以看作是审计日志。您还可以拥有记录技术系统事件的应用程序/基础设施日志记录。这些通常存储在不同的地方,并且大多是只写的。在 .NET 上,log4net 或 NLog 等框架用于处理技术系统事件的日志记录。您可以为这些框架创建基于 Rx 的实现,但这可能会增加不必要的复杂性。

此外,您当然可以将日志消息放在消息队列中,但我不确定您会从中得到什么。您的事件代理是进程内代理还是分布式的?如果是后者,那么除非绝对必要,否则我会避开它。

【讨论】:

经纪人目前正在处理中,不确定是否会一直如此。

以上是关于如何在 cqrs 上下文中正确处理日志记录?的主要内容,如果未能解决你的问题,请参考以下文章

「事件驱动架构」事件溯源,CQRS,流处理和Kafka之间的多角关系

python 上下文处理错误,记录日志

如何在所有执行上下文的播放框架日志中记录请求 ID

python日志处理

Python之日志处理 logging模块

Python之日志处理(logging模块)