传统日志记录 vs AOP 日志记录

18

我正在启动这个新项目,我们正在商讨我们的日志/调试方法,并希望向SO上的其他人提出问题,鉴于此。

private final static Logger logger = LoggerFactory.getLogger(getClass());
...
public void doSumething(){
...
if(logger.isDebugEnabled())
    logger.debug("...");
}
或者
 @After("execution(* *.doSomething())")
    public void logAfter(JoinPoint jp){
        logger.debug("...");
    }

AOP方法真的比传统方法更优吗?还是说AOP在记录/分析日志方面具有特定的用例?

4个回答

29

对于性能而言,AOP方法相对于传统方法肯定会有一些额外的开销。

AOP的许多优点之一是它允许你将非业务关注点与业务逻辑分离。它还可以帮助你完成一些乏味的任务,例如在每个方法中添加日志记录逻辑或在每个方法中放置try-catch语句。

我认为真正的问题在于,如果性能开销(根据我的经验仅仅是很少)可以弥补你在开发过程中必须经历的单调任务。

一个朋友曾经告诉我,拥有一个可维护和可扩展的较慢的应用程序要比拥有一个让你在维护方面吃大亏的更快的应用程序好。缓慢的应用程序可以通过升级硬件等方式进行补偿。

这只是我的个人看法,希望对你有所帮助。


4
我同意维护和可扩展性,因此我使用AOP风格。 - bora.oren

10

我认为这些不应该被视为互相排斥的选择。

我认为AOP很适合追踪(例如记录方法入口/出口和参数值)。

我仍然也使用常规日志:

  1. 用于信息/警告/错误消息
  2. 用于在开发期间进行调试消息,以查看某些变量的值或查看使用哪个if / then路径等。

1
你在什么情况下发现跟踪信息很有用?我的意思是,如果你已经有了适当的信息/警告/错误消息,那么你真的需要它吗? - Ignacio Soler Garcia

1

我同意@daxsorbito的答案,并希望在此基础上进一步完善。

  • 交叉切面建议可以使用配置文件进行配置,这样您就可以为生产日志记录设置不同的aop建议。这可能会提高性能。

  • AOP可以减少很多代码混乱,并鼓励开发人员专注于主要任务。

  • 如果代码有足够的日志记录,许多调试变得更加容易。AOP使其独立于开发人员。一些开发人员可能没有遵循充分记录的纪律,或者可能认为这是不必要的。

  • 日志文件具有一致的消息。(不再有“你说土豆,我说batata... :)”)-每个开发人员可能以不同的方式记录它。然而,如果我们将其AOP化,您可以使其在应用程序中保持一致,并轻松地在其上放置许多良好的分析。

  • 这还鼓励您编写小型可重用(如果这些方法有时可以进行测试则更好)的方法,这些方法可以很容易地进行调试。

  • 有时,这也会鼓励您遵循一致的命名约定,因为这将使在调试期间应用建议以记录这些方法更容易。


1

我非常喜欢面向方面的方法。将日志记录与逻辑分离感觉很合适。但我不确定性能开销如何。

即使您决定不使用AOP,也有比这更好的日志记录方法:

if(logger.isDebugEnabled())

看一下log4j,它可以让你改变日志级别,不同的追加器和很多其他的东西。


实际上,这是使用log4j,而且它使用了带有Logback的SLF4J("Log object {}",o)。 - non sequitor
2
关于AOP性能,请查看此链接:https://dev59.com/0XRC5IYBdhLWcg3wCMc6 - non sequitor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接