import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component; import java.io.PrintStream;
import java.util.Arrays; /**
* @Author : guoyanan
* @Title : 配置切面类,用于记录系统日志
* @Time : 2019/03/15 15:29
* @Document :
*/
@Aspect
@Component
public class SystemLogs { /**
* 配置切点方法
* 方便统一管理切点
* execution属性为切点需要管理的包路径
* 规则:
* execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?)
* 规则解释:
* modifiers-pattern?:修饰符匹配,也就是关键字匹配例如:public、private、protect;*代表所有
* ret-type-pattern:返回值匹配,可以是java基础类型也可以是自义定类,例如:基础类:String、List等,自定义类:UserInfo、OrderInfo等
* eclaring-type-pattern?:类路径匹配,切面需要管理的包路径,可以精确到类。也可以包下所有类,例如:com.test.*
* name-pattern:方法名匹配,根据方法名建立切点,例如:setName、set*等;set*表示所有以set开头的方法
* param-pattern:参数名匹配,根据方法的参数类型建立切点,参数使用“,”隔开使用*标识参数可以是任意类型,如果是(..)说明不限制参数个数
* throws-pattern?:异常类型匹配,可以根据异常类型匹配切点。例如:NullPointException、IOException等
* 注意:
* 带有?的说明是可以省略的类型
* 举例:
* execution(public String com.config.SystemTest.HelloWord(String)) IOException
* 这个语句的含义:匹配com.config.路径下SystemTest类中方法名为HelloWord且参数为一个String类型返回类型也是String的IOException异常的一个切点。
* 测试throws-pattern?:加与不加,没有明显的异常。可以认为是不需要的规则。
*/
@Pointcut("execution(public String com.busi.config.SystemTest.HelloWord(String)) IOException")
public void HelloWord(){} /**
* 引用切点HelloWord
* 打印切点进入前的参数和访问的类
* 访问切点前执行方法
* @param point
*/
@Before("HelloWord()")
private void before(JoinPoint point){ System.out.println("@Before:模拟权限检查..."); System.out.println("@Before:目标方法为:" + point.getSignature().getDeclaringTypeName() + "." + point.getSignature().getName()); System.out.println("@Before:参数为:" + Arrays.toString(point.getArgs())); System.out.println("@Before:被织入的目标对象为:" + point.getTarget()); } /**
* 访问切点执行后运行此方法
* @param point
* @param returnValue
*/
@AfterReturning(pointcut="HelloWord()",returning="returnValue")
private void afterReturning(JoinPoint point,Object returnValue){
System.out.println("@AfterReturning:模拟日志记录功能..."); System.out.println("@AfterReturning:目标方法为:" + point.getSignature().getDeclaringTypeName() + "." + point.getSignature().getName()); System.out.println("@AfterReturning:参数为:" + Arrays.toString(point.getArgs())); System.out.println("@AfterReturning:返回值为:" + returnValue); System.out.println("@AfterReturning:被织入的目标对象为:" + point.getTarget());
} /**
* 访问切点方法后运行方法,与@AfterReturning的区别是缺少了returning属性
* 认为:@AfterReturning是@After的升级
* @param point
*/
@After("HelloWord()")
public void after(JoinPoint point) { System.out.println("@After:模拟释放资源..."); System.out.println("@After:目标方法为:" + point.getSignature().getDeclaringTypeName() + "." + point.getSignature().getName()); System.out.println("@After:参数为:" + Arrays.toString(point.getArgs())); System.out.println("@After:被织入的目标对象为:" + point.getTarget()); } /**
* 执行后发生异常方法,可以用于捕捉执行过程中的异常
* @param jp
* @param e
*/
@AfterThrowing(pointcut = "HelloWord()",throwing="e")
public void doException(JoinPoint jp,Throwable e){
if(e!=null){
PrintStream printStream=System.err;
printStream.println(); }
} }

切点方法:

/**
* @Author : guoyanan
* @Title : 切点测试方法
* @Time : 2019/03/15 15:22
* @Document :
*/
@RestController
public class SystemTest { @RequestMapping("/hello")
public String HelloWord(@RequestParam("na") String name)throws NullPointerException{
String str = null;
try {
str.toUpperCase();
}catch (NullPointerException e){ } return "Hello Word"+name;
} @RequestMapping("/word")
public String Word(@RequestParam("na") String name){ String str = null;
str.toUpperCase(); return "Word"+name;
}
}

执行结果打印:

@Before:模拟权限检查...
@Before:目标方法为:com.busi.config.SystemTest.HelloWord
@Before:参数为:[1]
@Before:被织入的目标对象为:com.busi.config.SystemTest@17933314
@After:模拟释放资源...
@After:目标方法为:com.busi.config.SystemTest.HelloWord
@After:参数为:[1]
@After:被织入的目标对象为:com.busi.config.SystemTest@17933314
@AfterReturning:模拟日志记录功能...
@AfterReturning:目标方法为:com.busi.config.SystemTest.HelloWord
@AfterReturning:参数为:[1]
@AfterReturning:返回值为:Hello Word1
@AfterReturning:被织入的目标对象为:com.busi.config.SystemTest@17933314

AOP切面用于系统日志的更多相关文章

  1. spring AOP 之五:Spring MVC通过AOP切面编程来拦截controller

    示例1:通过包路径及类名规则为应用增加切面 该示例是通过拦截所有com.dxz.web.aop包下的以Controller结尾的所有类的所有方法,在方法执行前后打印和记录日志到数据库. 新建一个spr ...

  2. Spring Boot 中使用自定义注解,AOP 切面打印出入参日志及Dubbo链路追踪透传traceId

    一.使用背景 开发排查系统问题用得最多的手段就是查看系统日志,在分布式环境中一般使用 ELK 来统一收集日志,但是在并发大时使用日志定位问题还是比较麻烦,由于大量的其他用户/其他线程的日志也一起输出穿 ...

  3. 如何优雅地在 Spring Boot 中使用自定义注解,AOP 切面统一打印出入参日志 | 修订版

    欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 资深架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...

  4. Spring MVC通过AOP切面编程 来拦截controller 实现日志的写入

    首选需要参考的是:[参考]http://www.cnblogs.com/guokai870510826/p/5977948.html    http://www.cnblogs.com/guokai8 ...

  5. Spring Boot 2.0 教程 | AOP 切面统一打印请求日志

    欢迎关注微信公众号: 小哈学Java 文章首发于个人网站 https://www.exception.site/springboot/spring-boot-aop-web-request 本节中,您 ...

  6. Spring AOP 切面编程记录日志和接口执行时间

    最近客户现在提出系统访问非常慢,需要优化提升访问速度,在排查了nginx.tomcat内存和服务器负载之后,判断是数据库查询速度慢,进一步排查发现是因为部分视图和表查询特别慢导致了整个系统的响应时间特 ...

  7. Springboot项目使用aop切面保存详细日志到ELK日志平台

    上一篇讲过了将Springboot项目中logback日志插入到ELK日志平台,它只是个示例.这一篇来看一下实际使用中,我们应该怎样通过aop切面,拦截所有请求日志插入到ELK日志系统.同时,由于往往 ...

  8. AOP切面通知

    需要用的基本的jar包: aopalliance-1.0.jaraspectj-1.6.8.jaraspectjweaver-1.6.8.jarcommons-logging-1.1.3.jarspr ...

  9. springboot-实现log4j的AOP切面

    参考链接: https://www.cnblogs.com/liaojie970/p/7883687.html https://blog.csdn.net/autfish/article/detail ...

随机推荐

  1. [LintCode] 合并排序数组II

    class Solution { public: /** * @param A: sorted integer array A which has m elements, * but size of ...

  2. jQuery Validation Engine 表单验证,自定义规则验证方法

    jQuery Validation Engine 表单验证说明文档http://code.ciaoca.com/jquery/validation-engine/ js加到jquery.validat ...

  3. nodejs 循环中操作需要同步执行解决方案

    最近用nodejs做了个针对某网站的小爬虫.干坏事得低调对吧,不能同时开太多的网络访问,结果各种回调/循环虐的心力交瘁. 经过了n次的百度\哥哥后终于拼出了自己要的功能.不敢独享分享出来以供大家参考. ...

  4. Powershell Function Get-TimeZone

    代码原文地址: https://gallery.technet.microsoft.com/scriptcenter/Get-TimeZone-PowerShell-4f1a34e6 <# .S ...

  5. Logon Session Times

    How to Get User Logon Session Times from the Event Log To figure out user session time, you’ll first ...

  6. 把配置和环境解耦 eliminate “works on my machine” problems when collaborating on code with co-workers docker架构与解决的问题

    Docker实践 - 懒人的技术笔记 - 博客频道 - CSDN.NET  http://blog.csdn.net/lincyang/article/details/43055061 Docker直 ...

  7. 报错:SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape

    Outline SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: trunc ...

  8. ngs中reads mapping-pku的生信课程

    4.NGS中的reads mapping 顾名思义,就是将测序的得到的DNA定位在基因组上. 因为二代测序的得到的序列是较短的,reads mapping很好地解决了这个问题. 本质上reads ma ...

  9. mysql 练习题(Day44)

    init.sql文件内容 /* 数据导入: Navicat Premium Data Transfer Source Server : localhost Source Server Type : M ...

  10. python识别验证码

    1.tesseract-ocr安装 tesseract-ocr windows下载地址 http://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr- ...