赞
踩
SpringAop 想必大家都熟悉不能再熟悉了,AOP在项目中的使用场景有很多很多,今天主要是以日志收集为例,来使用一下AOP。
以下是一个简短的介绍:
随着现代互联网的普遍,上到老下到小都在使用我们的智能收集,而互联网离不开的即时我们的软件,比如说:淘宝、抖音 基本上这两款应用以及让我们的生活离不开。
日志即是:用户访问我们系统,我们将用户的信息和用户访问的某个具体功能点和访问的时间频次记录起来。
作用:方便我们直接在管理端定位错误信息,错误位置。为了以后大数据计算提高用户体验度。
以SpringBoot 项目为例(示例):
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-aop</artifactId>
- </dependency>
2. 设计组件注解
这里将日志模板设计为单独的组件,即是需要进行日志收集的项目引入改依赖
- /**
- * 系统日志注解
- *
- * @author Created by mr_zhou on 2020/1/30
- */
- @Target(ElementType.METHOD)
- @Retention(RetentionPolicy.RUNTIME)
- public @interface SysLog {
-
- // 接口描述
- String value() default "";
-
- // 0-后台 1-前台
- int type() default 1;
- }
3. 编写日志切面
@Pointcut :用于编写连接点的表达式,可以连接注解,具体方法等等..
@Around:环绕通知,在连接点前后都会执行,这样既可以拿到request也可用拿到response
@AfterThrowing:当发送异常是调用该通知,用于记录异常信息。
- /**
- * @author Created by mr_zhou on 2020/1/31
- */
- @Aspect
- @Component
- public class LoggingAspect {
-
- private final LoggingService loggingService;
-
- ThreadLocal<Long> currentTime = new ThreadLocal<>();
-
- private Logger logger = LoggerFactory.getLogger(LoggingAspect.class);
-
- public LoggingAspect(LoggingService loggingService) {
- this.loggingService = loggingService;
- }
-
- @Pointcut("@annotation(top.ananas.modules.log.annotation.SysLog)")
- public void logPointcut() { }
-
- /**
- * 记录controller日志,包括请求、IP、参数
- * @param joinPoint
- * @return Object
- * @throws Throwable
- */
- @Around("logPointcut()")
- public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
- Object result;
- currentTime.set(System.currentTimeMillis());
-
- result = joinPoint.proceed();
-
- long time = System.currentTimeMillis() - currentTime.get();
- Log log = new Log("INFO",time);
- currentTime.remove();
- HttpServletRequest request = SpringContextHolder.getHttpServletRequest();
-
- long uid = getUid();
- String ip = StringUtils.getIp(SpringContextHolder.getHttpServletRequest());
- // 存库
- loggingService.saveLogging(getUsername(), ip, joinPoint, log, uid);
-
- // 打印到控制台
- printLogConsole(uid,StringUtils.getMobileSystem(request),request.getRequestURI().toString(),ip,time);
-
- return result;
- }
-
- /**
- * 配置异常通知
- *
- * @param joinPoint join point for advice
- * @param e exception
- */
- @AfterThrowing(pointcut = "logPointcut()", throwing = "e")
- public void logAfterThrowing(JoinPoint joinPoint, Throwable e) {
- Log log = new Log("ERROR",System.currentTimeMillis() - currentTime.get());
- currentTime.remove();
- log.setExceptionDetail(ThrowableUtils.getStackTrace(e).getBytes());
-
- String ip = StringUtils.getIp(SpringContextHolder.getHttpServletRequest());
- // 存储异常信息
- loggingService.saveLogging(getUsername(), ip, (ProceedingJoinPoint)joinPoint, log,getUid());
- }
-
- /**
- * 输出到控制台
- * @param userId
- * @param mobile
- * @param url
- * @param ip
- * @param time
- */
- private void printLogConsole(long userId,String mobile,String url,String ip,long time){
- // 记录下请求内容
- StringBuilder sb = new StringBuilder();
- sb.append(userId + "-" + mobile);
- sb.append(" - " + url + " - ");
- sb.append(ip + " - ");
- sb.append(time + "ms");
-
- logger.info(sb.toString());
- }
-
- private String getUsername() {
- try {
- return SecurityUtils.getUsername();
- } catch (Exception e) {
- return "";
- }
- }
-
- private Long getUid(){
- try {
- return SecurityUtils.getUserId();
- } catch (Exception e) {
- return 0L;
- }
- }
-
- }
使用:在需要收集日志的接口上加入 注解 即会自动收集日志
项目目录结构:
数据库记录:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。