【问题标题】:Centralising logging using Spring AOP使用 Spring AOP 集中日志记录
【发布时间】:2012-09-30 09:34:32
【问题描述】:

我希望你们能够帮助我解决我目前面临的难题。我目前正在处理一个现有的 Web 应用程序项目,其中一个要求是我们必须集中日志记录。应用程序是一个分层应用程序,由客户端层(即视图)、服务层、业务层和 DAO 层组成。

目前,应用程序中的日志记录由控制器方法处理,其中每个需要记录一些信息的控制器方法通过调用日志记录函数手动记录数据。这些控制器方法处理的请求来自许多不同的客户端来源,包括移动设备(例如手机)、Web 浏览器、Web 服务等。目前,所有需要记录的数据都被捕获在一个通用对象中,该对象被传递给记录方法将这些属性保存到数据库表中。

问题在于,这个通用对象正是通用对象。它用于许多其他任务,包括日志记录、搜索和许多其他任务。当此通用对象用于记录时,除了几个属性外,用于填充通用对象(在记录的情况下)的大多数属性都来自请求,即(一个 HttpServletRequest 对象) .由于这个对象的多功能性,这个通用对象有可能被滥用。因此,我们想摆脱这个通用对象并为专门的任务创建专门的对象。在日志记录的情况下,我们决定创建一个日志记录对象,我们将使用它来持久化我们需要记录的数据。我们将使用 Spring AOP 影响日志记录

难题是这样的

1)我们是否应该使用控制器来设置我们想要记录的新的专用日志对象的属性,然后使用 AOP 建议,在控制器方法完成执行后检索日志对象以进行持久性

2)我们是否应该使用我们放置在请求对象(即 HttpServletRequest 对象)中的属性在 AOP 建议中设置新日志对象的属性?

我对选项 1 的问题是控制器会意识到日志记录,而且根据良好的设计原则,控制器只应该将任务委托给业务和服务层以执行此类任务。选项 1 意味着控制器所做的不仅仅是委派任务,即它将构建日志对象

我对选项 2 的问题是它将我的日志记录对象与请求对象(即 HttpServletRequest 对象)紧密耦合,因此我想知道这种方法是否有任何潜力。

欢迎任何形式的建议、建议和批评。另外,如果有人不得不处理类似的情况,我想听听他们是如何解决这个问题的。

提前谢谢大家。

【问题讨论】:

    标签: spring logging aop


    【解决方案1】:

    我会使用方面将日志记录添加到服务层,表示为接口。

    您可以使用 HTTP 过滤器或方面从控制器层进行日志记录。

    您可以根据需要在多个层中应用 AOP。

    【讨论】:

    • 感谢您的回复 duffymo。它很有帮助。只是,想知道您答案的第 2 行,即“您可以使用 HTTP 过滤器或方面从控制器层进行日志记录。”您是否暗示您宁愿在控制器方法本身而不是在方面/建议中设置日志对象的属性?如果是这样,为什么这种方法比从 HttpServletRequest 对象中检索日志对象所需的属性并在建议/方面设置日志对象的属性更好?
    • 我没有在任何控制器中设置日志属性。只需将记录器添加到方面或过滤器。我使用 log4j,所以 logger 属性是完全外部化的。
    • 感谢您的意见。它将帮助我做出决定
    猜你喜欢
    • 2018-04-13
    • 2012-11-04
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 2015-08-18
    • 1970-01-01
    相关资源
    最近更新 更多