在Spring Boot 项目中使用Spring AOP实现切面日志
导语
大数据时代,数据来源是比较重要的。而日志作为用户操作、系统监控、业务分析等都比较重要的一个环节。能更好的使用日志显得尤为重要。那么在Spring Boot的项目中如何能更加高效的记录Controller层的日志呢?这个就是今天需要讨论的问题。
直接上代码,不过在实现之前,为了让项目支持AOP的操作这里首先需要引入一个maven依赖,这里对于AOP的原理就先不做说明了,是一个比较大的内容。
<!-- SpringBoot AOP 场景启动器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>
这里需要我们基于注解来实现,这样,在有需要的Controller中直接标注相应的注解就可以了。这里我们就可以将整个注解称为是一个切点。
@Target({ ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogAs {/*** 模块*/public String title() default "";/*** 小程序端*/public int client() default 2;/*** 业务类型*/public int businessType() default 0;
}
@Aspect
@Component
public class LogAspect {private static final Logger log = LoggerFactory.getLogger(LogAspect.class);// 配置织入点@Pointcut("@annotation(com.ziicoo.ksxt.core.annotation.LogAs)")public void logPointCut(){}@Before("logPointCut()")public void doBefore(JoinPoint joinPoint){ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();try {LogAs controllerLogAs = getAnnotationLog(joinPoint);log.info("URL : " + request.getRequestURL().toString());log.info("HTTP_METHOD : " + request.getMethod());log.info("IP : " + request.getRemoteAddr());log.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());log.info("ARGS : " + Arrays.toString(joinPoint.getArgs()));log.info("ARGS : " + JSONObject.toJSONString(joinPoint.getArgs()));} catch (Exception e) {e.printStackTrace();}}// @Around("logPointCut()")
// public void around(JoinPoint joinPoint){//
// log.info("环绕");
// }@After("logPointCut()")public void doAfter(JoinPoint joinPoint){log.info("操作内容");}/*** 处理完请求后执行** @param joinPoint 切点*/@AfterReturning(pointcut = "logPointCut()", returning = "jsonResult")public void doAfterReturning(JoinPoint joinPoint, Object jsonResult){handleLog(joinPoint, null, jsonResult);}protected void handleLog(final JoinPoint joinPoint, final Exception e, Object jsonResult){try{// 获得注解LogAs controllerLogAs = getAnnotationLog(joinPoint);if (controllerLogAs == null){return;}log.info(JSONObject.toJSONString(jsonResult));log.info(jsonResult.toString());}catch (Exception exp){// 记录本地异常日志log.error("==前置通知异常==");log.error("异常信息:{}", exp.getMessage());exp.printStackTrace();}}/*** 是否存在注解,如果存在就获取*/private LogAs getAnnotationLog(JoinPoint joinPoint) throws Exception{Signature signature = joinPoint.getSignature();MethodSignature methodSignature = (MethodSignature) signature;Method method = methodSignature.getMethod();if (method != null){return method.getAnnotation(LogAs.class);}return null;}}
完成以上的两个操作,就可以实现一个简单的日志AOP操作。简单方便,在使用的时候直接在对应的Controller方法上加上注解就可以实现对该方法的日志记录了!
在Spring Boot 项目中使用Spring AOP实现切面日志相关推荐
- Spring Security是什么,以及如何在Spring Boot项目中整合Spring Security并且使用它,下面我们通过一个登录案例简单介绍一下Spring Security。
1.什么是Spring Security? 在了解Spring Security之前,我们是不是应该先思考一个问题,我们自己写的web案例一般都需要先登录,之后登录之后才能访问其他页面,或者说我们不同 ...
- spring boot 项目源码_Spring Boot2 系列教程(三)理解 Spring Boot 项目中的 parent
前面和大伙聊了 Spring Boot 项目的三种创建方式,这三种创建方式,无论是哪一种,创建成功后,pom.xml 坐标文件中都有如下一段引用: <parent><groupId& ...
- 在Spring Boot项目中使用Spock框架
转载:https://www.jianshu.com/p/f1e354d382cd Spock框架是基于Groovy语言的测试框架,Groovy与Java具备良好的互操作性,因此可以在Spring B ...
- scheduled每天下午1点执行一次_在Spring Boot项目中使用@Scheduled注解实现定时任务...
在java开发中定时任务的实现有多种方式,jdk有自己的定时任务实现方式,很多框架也有定时任务的实现方式.这里,我介绍一种很简单的实现方式,在Spring Boot项目中使用两个注解即可实现. 在sp ...
- Spring Boot 项目中Java对象的字符串类型属性值转换为JSON对象的布尔类型键值的解决方法及过程
文章目录 场景描述 示例说明 解决历程 @JsonFormat是否能解决问题? 万能方案-调试 替代方案 补充知识 Java对象与JSON对象的序列化与反序列化 相关注解说明 后记 场景描述 在Spr ...
- Spring Boot项目中使用RestTemplate调用https接口出现 unable to find valid certification path to requested target
问题描述:Spring Boot项目中使用RestTemplate调用https接口出现以下错误: PKIX path building failed: sun.security.provider.c ...
- Spring Boot项目中集成Elasticsearch,并实现高效的搜索功能
Spring Boot项目中集成Elasticsearch 前言 环境准备 引入依赖 配置Elasticsearch连接信息 定义实体类 定义Elasticsearch操作接口 实现搜索功能 总结 前 ...
- spring boot 项目中遇到的错误(tomcat 400)
spring boot 项目 get传入的参数是 json数组的时候 会报400 原因:是因为tomcat的版本太高 https://blog.csdn.net/fxz1535567862/arti ...
- spring boot项目中处理Schedule定时任务
默认,springboot已经支持了定时任务Schedule模块,所以一般情况已经完全能够满足我们的实际需求,一般来说,没有必要在加入其他类似于:quartz 另外,在这里提一个实际项目中,关于定时任 ...
最新文章
- 【数据结构】顺序栈的实现(C语言)
- 我拍了拍 Redis,没想到被移出了群聊......
- Linux修改mysql的密码
- Laravel5.2之Filesystem-从Dropbox中下载文件到AWS S3
- LVS:三种负载均衡方式比较+另三种负载均衡方式
- flask post json_Flask 和 requests 搭建一个简单的API服务
- spingbot 与 activiti 整个 中创建表而找不到表的问题(创建表失败)
- oracle存档模式,Oracle学习系列之如何开启归档模式
- 网游中的网络编程3:在UDP上建立虚拟连接
- 提升机器学习数学基础,这7本书一定要读-附pdf资源
- 第0课【课前准备】Keil安装 ISP程序下载
- C++派生类与继承(超详细)
- 0成本副业项目,适合小白操作的信息差创业项目
- 嵌入式学习笔记-迅为4412开发板实现一键开关机休眠唤醒
- 那些年的广告语【持续更】
- 论文笔记:The Effectiveness of Data Augmentation in Image Classification using Deep Learning
- 安卓APP源码和设计报告——基于Android的垃圾分类系统
- 《SQL基础》06. 函数
- learnopengl——Specular IBL——貌似读懂了
- 科软计算机录取人数,科软是如何用5年时间从招生靠调剂到406名400+大神的?