使用 Spring AOP 记录是个好主意吗?
Posted
技术标签:
【中文标题】使用 Spring AOP 记录是个好主意吗?【英文标题】:Is using Spring AOP for logging a good idea? 【发布时间】:2011-01-05 11:26:03 【问题描述】:我目前正在阅读 Spring,其中一个用于使用 AOP 的示例是记录方法调用的开始和结束。
我还了解到使用 AOP 会影响性能。
对于这种类型的日志记录,使用 Spring AOP 是个好主意吗?我的理解是 Spring 使用 Dynamic AOP 是否会更好地为这种类型的 AOP 使用 Static AOP(如 AspectJ)。
目前我工作的公司的编码政策需要大量的日志记录,我想减少我必须编写的日志记录代码的数量并提高我的代码的可读性。
我是不是找错树了?
【问题讨论】:
【参考方案1】:阅读this blog-post 了解您的性能问题。
考虑 AOP 的方式是将提供的功能优势放在首位。如果自动日志记录是您的要求并且 AOP 适合它,那就去吧。
也就是说,如果需要细粒度的日志记录,加载时编织当然是首选。
【讨论】:
【参考方案2】:我使用 Spring AOP 来实现日志记录,所以我分享一下我的观察:
性能影响不够,小于日志记录本身的影响 在 Spring 配置中配置了方面,如有必要,您可以完全禁用日志记录代码 随着堆栈跟踪变得相当长,调试变得更加困难 这样的决定足以影响设计。不仅你得到一堆接口和方面类,而且你的生产类必须非常“瘦”。不要忘记,您无法拦截对非公共方法的调用。自调用(甚至是公共方法)也无法被拦截(因为您使用裸this
句柄而不是由 AOP 包装的句柄),因此无法记录。因此,所有日志记录只能发生在接口边界上。 (这涉及使用基于代理的切面编织,有一个使用 cglib 进行运行时子类化的选项,但我没有使用它)
编写切入点可能非常棘手。 IntelliJ Idea 极大地帮助确定切入点建议哪些方法。
总的来说,我喜欢这种方法并认为它值得使用,但它看起来比我预期的要复杂得多
【讨论】:
【参考方案3】:我的做法与this blog post 中描述的方式类似。这是我找到的最好的,它还有一个sample,很好地显示了使用和不使用 AOP 之间的区别。
恕我直言,这不值得,除非您正在做一些比记录更有趣的事情,例如持久性的错误管理。如果您有良好的异常层次结构(域、系统)并正确设置日志边界,则不会减少太多日志代码。
【讨论】:
链接指向博客站点,而不是相关主题的实际博客 @SandeepJindal 我已编辑帖子以更新链接。以上是关于使用 Spring AOP 记录是个好主意吗?的主要内容,如果未能解决你的问题,请参考以下文章
在 django 生产中记录所有 sql 查询是个好主意吗?