导语
  大数据时代,数据来源是比较重要的。而日志作为用户操作、系统监控、业务分析等都比较重要的一个环节。能更好的使用日志显得尤为重要。那么在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实现切面日志相关推荐

  1. Spring Security是什么,以及如何在Spring Boot项目中整合Spring Security并且使用它,下面我们通过一个登录案例简单介绍一下Spring Security。

    1.什么是Spring Security? 在了解Spring Security之前,我们是不是应该先思考一个问题,我们自己写的web案例一般都需要先登录,之后登录之后才能访问其他页面,或者说我们不同 ...

  2. spring boot 项目源码_Spring Boot2 系列教程(三)理解 Spring Boot 项目中的 parent

    前面和大伙聊了 Spring Boot 项目的三种创建方式,这三种创建方式,无论是哪一种,创建成功后,pom.xml 坐标文件中都有如下一段引用: <parent><groupId& ...

  3. 在Spring Boot项目中使用Spock框架

    转载:https://www.jianshu.com/p/f1e354d382cd Spock框架是基于Groovy语言的测试框架,Groovy与Java具备良好的互操作性,因此可以在Spring B ...

  4. scheduled每天下午1点执行一次_在Spring Boot项目中使用@Scheduled注解实现定时任务...

    在java开发中定时任务的实现有多种方式,jdk有自己的定时任务实现方式,很多框架也有定时任务的实现方式.这里,我介绍一种很简单的实现方式,在Spring Boot项目中使用两个注解即可实现. 在sp ...

  5. Spring Boot 项目中Java对象的字符串类型属性值转换为JSON对象的布尔类型键值的解决方法及过程

    文章目录 场景描述 示例说明 解决历程 @JsonFormat是否能解决问题? 万能方案-调试 替代方案 补充知识 Java对象与JSON对象的序列化与反序列化 相关注解说明 后记 场景描述 在Spr ...

  6. 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 ...

  7. Spring Boot项目中集成Elasticsearch,并实现高效的搜索功能

    Spring Boot项目中集成Elasticsearch 前言 环境准备 引入依赖 配置Elasticsearch连接信息 定义实体类 定义Elasticsearch操作接口 实现搜索功能 总结 前 ...

  8. spring boot 项目中遇到的错误(tomcat 400)

    spring boot 项目 get传入的参数是 json数组的时候  会报400 原因:是因为tomcat的版本太高 https://blog.csdn.net/fxz1535567862/arti ...

  9. spring boot项目中处理Schedule定时任务

    默认,springboot已经支持了定时任务Schedule模块,所以一般情况已经完全能够满足我们的实际需求,一般来说,没有必要在加入其他类似于:quartz 另外,在这里提一个实际项目中,关于定时任 ...

最新文章

  1. 【数据结构】顺序栈的实现(C语言)
  2. 我拍了拍 Redis,没想到被移出了群聊......
  3. Linux修改mysql的密码
  4. Laravel5.2之Filesystem-从Dropbox中下载文件到AWS S3
  5. LVS:三种负载均衡方式比较+另三种负载均衡方式
  6. flask post json_Flask 和 requests 搭建一个简单的API服务
  7. spingbot 与 activiti 整个 中创建表而找不到表的问题(创建表失败)
  8. oracle存档模式,Oracle学习系列之如何开启归档模式
  9. 网游中的网络编程3:在UDP上建立虚拟连接
  10. 提升机器学习数学基础,这7本书一定要读-附pdf资源
  11. 第0课【课前准备】Keil安装 ISP程序下载
  12. C++派生类与继承(超详细)
  13. 0成本副业项目,适合小白操作的信息差创业项目
  14. 嵌入式学习笔记-迅为4412开发板实现一键开关机休眠唤醒
  15. 那些年的广告语【持续更】
  16. 论文笔记:The Effectiveness of Data Augmentation in Image Classification using Deep Learning
  17. 安卓APP源码和设计报告——基于Android的垃圾分类系统
  18. 《SQL基础》06. 函数
  19. learnopengl——Specular IBL——貌似读懂了
  20. 科软计算机录取人数,科软是如何用5年时间从招生靠调剂到406名400+大神的?

热门文章

  1. HTML中光移动边框,CSS 边框各边
  2. web端功能自动化定位元素(暂不更新)
  3. url传参(中文乱码)值得注意的地方
  4. Linux用户不在sudoers文件中
  5. 写给90后快30岁的我们
  6. content:\2b 是什么意义
  7. 与时共舞,力求变革【我眼中的戴尔转型】
  8. fpga 输入信号除了1和0还有别的状态?
  9. 企业如何考虑自己的网络防护设备
  10. jenkins添加linux作为slave