代码之家  ›  专栏  ›  技术社区  ›  Omar Kooheji

使用SpringAOP进行日志记录是个好主意吗?

  •  29
  • Omar Kooheji  · 技术社区  · 15 年前

    我现在正在阅读Spring,其中一个使用AOP的例子是记录方法调用的开始和结束。

    我还读到使用AOP会影响性能。

    对于这种类型的日志,使用SpringAOP是一个好主意吗?我的理解是Spring使用动态AOP,对于这种类型的AOP,最好使用静态AOP(如AspectJ)。

    目前,我工作的公司的编码策略需要大量的日志记录,我想减少我必须编写的日志记录代码的数量,提高代码的可读性。

    我找错树了吗?

    3 回复  |  直到 13 年前
        1
  •  14
  •   Bozho    15 年前

    this blog-post 关于您的性能问题。

    考虑AOP的方法是将所提供的功能优势放在首位。如果自动化日志记录是您的需求,并且AOP适合它,那么就去做吧。

    也就是说,如果需要细粒度的日志记录,负载时间交织当然是首选的。

        2
  •  34
  •   Rorick    15 年前

    我使用SpringAOP来实现日志记录,因此我分享我的观察结果:

    • 性能影响不够,小于日志本身的影响
    • 在Spring配置中配置了方面,您可以在必要时完全禁用日志代码。
    • 随着堆栈跟踪变得更长,调试变得更麻烦。
    • 这样的决定足以影响设计。这不仅是因为您得到了大量的接口和方面类,而且您的生产类必须非常“瘦”。别忘了,您无法截获对非公共方法的调用。自我调用(甚至公共方法)也不能被截取(就像你使用裸体的方法一样) this 句柄而不是由AOP包装的句柄),因此无法记录。因此,所有日志记录只能在接口边界上进行。(这涉及到使用基于代理的方面编织,有一个使用cglib的运行时子类化选项,但我没有使用它)
    • 写切入点可能非常棘手。intellij思想有助于很大程度上确定哪些方法将被切入点通知。
    • 一般来说,我喜欢这种方法,认为它值得使用,但它似乎比我预期的要复杂得多。
        3
  •  3
  •   lisak    13 年前

    我的做法与 this blog post . 这是我找到的最好的,它也有一个 sample 这很好地显示了使用AOP和不使用AOP之间的区别。

    imho它不值得这样做,除非你做了一些更高级的日志记录,比如带有持久性的错误管理。如果您有一个良好的异常层次结构(域、系统),并且正确地设置了日志记录边界,那么您不会减少太多的日志记录代码。