Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logging 请求日志记录属于哪里?_Logging_Architecture - Fatal编程技术网

Logging 请求日志记录属于哪里?

Logging 请求日志记录属于哪里?,logging,architecture,Logging,Architecture,日志逻辑应该放在视图层还是服务层 我认为服务层更有意义,因为它是多个不同视图(http、rpc等)的公共层。如果日志记录是在视图层中完成的,那么必须为每个不同的视图实现日志记录 但另一方面,如果所有的日志逻辑都在服务层中,那么在视图级别将不会记录传入的请求和失败(例如JWT身份验证失败,它在请求到达服务之前检查HTTP请求头) 应该在哪里进行日志记录?日志记录是一个交叉关注点,这意味着它在许多层中进行(类似于身份验证)。因此,如果您觉得需要从表示层登录,只需使用公共接口即可,该接口独立于实际实现

日志逻辑应该放在视图层还是服务层

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

但另一方面,如果所有的日志逻辑都在服务层中,那么在视图级别将不会记录传入的请求和失败(例如JWT身份验证失败,它在请求到达服务之前检查HTTP请求头)


应该在哪里进行日志记录?

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

总之,日志记录可以发生在每一层中,但是您应该避免分散
logger.log()
调用在代码中的任何地方,而是使用一些更结构化的方法(中央异常处理类、aop或事件)


顺便说一句,这个问题与DDD无关,所以我认为您应该删除域驱动的设计标签。

为什么两者都不可以?让应用程序配置设置确定要启用/禁用的日志记录。任何一个好的日志框架都会有这样的配置选项。我不知道,我有点喜欢将日志逻辑集中在一个位置的想法。此外,如果日志记录是作为网关服务实现的,那么视图(理想情况下)应该不知道它。如果我开始在视图层中进行日志记录,它需要了解这个第三方日志服务器,并知道如何与之通信。应用层根本不需要了解这种依赖关系。不同技术之间的细节可能有所不同,但一般来说,我在我的域中会有一个日志接口,所有组件都可以登录到该接口。我的依赖项反转将为该接口提供实现,使用该接口的任何给定组件都不知道该实现。我想如果你任意地只想登录一个地方,那么你就必须选择一个地方。但是应用程序代码和服务代码做了非常不同的事情,并且在非常不同的数据上运行,我个人希望能够同时记录这两种代码。这是一个很好的观点。我只是担心,当我真正想要的是让视图尽可能的愚蠢时,通过在视图中加入太多的逻辑,使视图变得比需要的更聪明。在我看来,让视图层向其他服务器发出http请求似乎是错误的。也许一种解决方案是在请求上下文中记录错误,然后将其传递到记录错误的服务中……我删除了DDD标记