请求记录属于哪里?

时间:2017-04-05 17:24:54

标签: logging architecture

是否应将记录逻辑放在视图层或服务层中?

我认为服务层更有意义,因为它是多个不同视图(http,rpc等)的公共层。如果在视图层中完成了日志记录,则必须为每个不同的视图实现日志记录。

但另一方面,如果所有日志记录逻辑都在服务层中,则在视图级别没有任何内容可以记录传入请求和失败(例如,JWT身份验证失败,它会在请求之前检查HTTP请求标头永远达到服务。)

应该在何处进行记录?

1 个答案:

答案 0 :(得分:0)

日志记录是一个跨领域的问题,这意味着它发生在许多层(类似于身份验证)。所以,如果你觉得你需要从例如表示层 - 您只需使用一个独立于实际实现的通用接口即可。例如,在Java中,我们经常使用slf4j,它是底层记录器实现的外观。但是,你是对的,拥有一个使用该日志门面的地方通常是个好主意。通常,您主要记录异常,警告等,因此您将它们记录在负责处理异常的组件中。在Spring中,@ControllerAdvice注释通常用于标记此类组件(它为您提供拦截所有控制器调用的选项,例如在中心位置处理您的异常)。另一种选择是使用AOP编程(例如AspectJ)来记录所有方法/异常(但它不允许您配置在建议的连接点的运行时期间记录哪些消息)。您还可以使用事件,这是一个非常优雅的解决方案,因为您的代码所做的一切都是为了引发有意义的事件,这些事件将在其他地方处理(例如,由负责记录所有事件的组件)。

因此,总结一下 - 日志记录可以在每个层中进行,但是您应该避免在代码中的任何地方散布logger.log()调用,并使用一些更结构化的方法(中央异常处理类,aop或事件)来代替

BTW,问题与DDD无关,所以我认为你应该删除域驱动设计标签。