如何在 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 上下文中正确处理日志记录?的主要内容,如果未能解决你的问题,请参考以下文章