【问题标题】:How is logging properly handled in cqrs context?如何在 cqrs 上下文中正确处理日志记录?
【发布时间】:2013-07-11 20:15:02
【问题描述】:
我试图弄清楚如何处理登录 CQRS 设置。情况如下:
- 我有一个基于 Rx 的事件代理。
- 我有一个项目
Foo.Events,其中事件从EventArgs 继承(不知道为什么),因此代理希望所有事件都从此类继承。
- 我有几个子系统(使用 DI 初始化)发布到日志中。
- 我需要几个子系统来处理日志记录请求并相应地处理它们(显示在屏幕上,发送 xmpp/sms/whatever)
现在,我正试图弄清楚如何适应登录。在 CQRS 中,在我看来,日志记录本身并不是一个事件,而是系统对事件的响应。另一方面,日志请求看起来像一个命令,即 CQRS 中的 C。
我很想以某种方式将其放入事件代理中,但我不确定。无论如何,命令是否属于事件代理,我们是否可以假设代理只是一些消息系统,并不真正关心它是 C 还是 Q?
非常感谢您的帮助!
【问题讨论】:
标签:
logging
domain-driven-design
messaging
cqrs
【解决方案1】:
日志记录是一个基础设施问题。命令和事件(通常)与业务相关。记录只会在必要时进行,技术实施取决于您。它既不是命令也不是事件。它记录其中之一已经发生。事实上,您甚至可能想要记录某些查询。
您可以将事件存储在事件日志中(甚至在事件存储中)并将它们用作日志。如果您需要记录命令和/或某些查询,您还可以使用日志处理程序包装您的命令和查询处理程序。
【解决方案2】:
日志在不同的上下文中以不同的方式表现出来。在 CQRS 中,领域事件的存储可以看作是审计日志。您还可以拥有记录技术系统事件的应用程序/基础设施日志记录。这些通常存储在不同的地方,并且大多是只写的。在 .NET 上,log4net 或 NLog 等框架用于处理技术系统事件的日志记录。您可以为这些框架创建基于 Rx 的实现,但这可能会增加不必要的复杂性。
此外,您当然可以将日志消息放在消息队列中,但我不确定您会从中得到什么。您的事件代理是进程内代理还是分布式的?如果是后者,那么除非绝对必要,否则我会避开它。