2017-04-05 103 views
0

应该将日志逻辑放在视图层还是服务层?请求日志属于哪里?

我想服务层更有意义,因为它是一种常见的层之下的多个不同的视图(HTTP,RPC等)。如果日志记录是在视图层完成的,那么它必须针对每个不同的视图执行。但是另一方面,如果所有日志逻辑都在服务层中,那么在视图级别就不会记录传入的请求和失败事件(例如,JWT身份验证失败,它将在请求永远达到服务)。

应该在哪里记录发生的呢?

+0

为什么不能同时使用?让应用程序配置设置确定启用/禁用哪个日志记录。任何体面的日志框架都会有这样的配置选项。 – David

+0

我不知道,我有点像在一个位置集中记录逻辑的想法。此外,如果日志记录是作为网关服务实现的,视图应该(理想情况下)不知道它。如果我要开始在视图层登录,它需要了解这个第三方日志记录服务器并知道如何与之通信。 – user7467314

+0

应用程序层完全不需要该依赖关系的知识。技术之间的细节可能会有所不同,但通常情况下,我的域中会有一个日志记录界面,所有组件都可以记录。我的依赖倒置将为该接口提供实现,对于使用该接口的任何给定组件来说都是未知的。我想如果你任意只想登录一个地方,那么你必须为此选择一个地方。但是,应用程序代码和服务代码做了非常不同的事情,并运行在非常不同的数据上,我个人希望可以选择同时登录。 – David

回答

0

日志记录是一个横切关注点,这意味着它发生在许多层(类似于验证)。所以,如果您觉得您需要从例如表示层 - 您只需使用一个独立于实际实现的通用接口来完成。例如,在Java中,我们经常使用slf4j,它是底层记录器实现的一个外观。然而,你说得对,一个地方使用这个伐木立面通常是个好主意。通常你会记录大多数异常,警告等,因此你将它们记录在负责处理异常的组件中。在Spring,往往@ControllerAdvice注释被用来标记这样的组件(它给你的选项拦截所有控制器调用和例如在一个中心位置处理您的例外)。另一种选择是使用AOP程序(例如AspectJ)来记录所有的方法/异常(但它不会允许您配置在运行时要记录哪些消息的谏连接点)。您还可以使用事件,这是一个非常优雅的解决方案,因为您的代码所做的一切都是为了引发有意义的事件,这些事件将在别处处理(例如由负责记录所有事件的组件)。总结起来 - 记录可能发生在每一层,但是你应该避免在你的代码中的任何地方分散调用你的logger.log()调用,并且使用更加结构化的方法(中央异常处理类,aop或事件)。

顺便说一句,这个问题是不相关的DDD,所以我觉得你应该删除领域驱动设计的标签。

+0

我删除了DDD标记 –