利用AOP实现日志切面统一处理
最近很多业务日志需要优化改进,实现对业务更好的监控和优化。下面介绍利用Spring Aop实现面向切面编程的一个实例。能够实现不改动原有代码逻辑,只加一行描述即可实现统一日志收集。
实现思路
定义两个注解类,分别给service类和controller类使用,然后使用切面类,对这两个注解进行绑定监控。
可以达到效果就是,只需要在我们想要监控的敏感方法增加一行代码注解,相当于切点,那这个切面类就可以监控获取到这个方法的相关输入,输出参数等。
- 切点:匹配连接点的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。
- 切面:一个关注点的模块化,可以额外执行独立的模块,不影响业务主流程,这个关注点可能会横切多个对象。在Spring AOP中,切面可以使用基于@Aspect注解的方式来实现。
实现AOP配置
是Spring的配置标签,beans里面几个重要的属性:
-
xmlns
是默认的xml文档解析格式,即spring的beans。地址是
http://www.springframework.org/schema/beans
。通过设置这个属性,所有在beans里面声明的属性,可以直接通过<>来使用,比如等等。 -
xmlns:xsi
是xml需要遵守的规范,通过URL可以看到,是w3的统一规范,后面通过xsi:schemaLocation来定位所有的解析文件。 -
xmlns:aop
这个是重点,是我们这里需要使用到的一些语义规范,与面向切面AOP相关。
实现类结构
两个自定义的注解类ControllerLogAnnotation,ServiceLogAnnotation分别给Controller 和Service使用。
spring aop支持的通知:
-
@Before:前置通知:在某连接点之前执行的通知,但这个通知不能阻止连接点之前的执行流程(除非它抛出一个异常)。
-
@AfterReturning :后置通知:在某连接点正常完成后执行的通知,通常在一个匹配的方法返回的时候执行。
-
@AfterThrowing:异常通知:在方法抛出异常退出时执行的通知。
-
@After 最终通知。当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
-
@Around:环绕通知:包围一个连接点的通知,如方法调用。这是最强大的一种通知类型。环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它自己的返回值或抛出异常来结束执行。
本次除了环绕通知和最终通知,都结合做了实例演示,封装在SystemLogAspect中。
最终效果如下:
在自己的需要监控的业务代码相关方法上增加一行注解如下图:
之后运行起来的效果如下:
还可以根据自己的需要将相对于的日志保存在数据库中或者利用Log4J输出到文件,更加好的方案可以利用ELK+KAFKA方案将日志收集起来便于检索。
此次分享仅仅是抛砖引玉,深入了解更多Spring Aop的编程方法会发现有很多有意思的地方。希望有助于大家在最近的日志改造方案上有一些思路上的启发。
整个AOP代码我压缩在附件中,大家有需要可以下载下来。直接嵌入到自己的工程中,按照上述配置搭建好可以达到开箱即用的效果。
参考文章:
https://my.oschina.net/u/2434456/blog/602487
http://itindex.net/detail/50710-springaop-controller-service
https://my.oschina.net/itblog/blog/211798