一,添加依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

二,编写切面类

/*** @program: beidou* @description: 记录必要请求日志* @author: shengkai* @create: 2018-08-23 15:31**/
@Aspect
@Component
@Order(-5)
public class WebLogAspect {private  final Logger log = LoggerFactory.getLogger(WebLogAspect.class);private static ThreadLocal<Long> time = new ThreadLocal<Long>(){protected Long initialValue() {long beginTime = System.currentTimeMillis();return beginTime;}};//直接注入会有空指针问题private static final ThreadLocal<InvokeLog> invokelog = new ThreadLocal<InvokeLog>(){protected InvokeLog initialValue() {return new InvokeLog();}};@AutowiredInvokeLogMapper invokeLogMapper;public WebLogAspect() {}/*** 定义一个切入点.* 解释下:* ~ 第一个 * 代表任意修饰符及任意返回值.* ~ 第二个 * 任意包名* ~ 第三个 * 代表任意方法.* ~ 第四个 * 定义在web包或者子包* ~ 第五个 * 任意方法* ~ .. 匹配任意数量的参数.*/@Pointcut("@annotation(com.kuainiu.beidou.service.base.components.InvokeLog)")public void invokeLog(){invokelog.set(new InvokeLog());}@Before(value = "invokeLog()")public void doBefore(JoinPoint joinPoint) throws Throwable {time.set(System.currentTimeMillis());// 接收到请求,记录请求内容ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();// 记录下请求内容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()));InvokeLog invokeLog = invokelog.get();invokeLog.setCreateTime(new Date());invokeLog.setUrl(request.getRequestURL().toString());invokeLog.setHttpMethod(request.getMethod());invokeLog.setIp(request.getRemoteAddr());invokeLog.setClassMethod(joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());invokeLog.setArgs(Arrays.toString(joinPoint.getArgs()));}@AfterReturning(returning = "ret", pointcut = "invokeLog()")public void doAfterReturning(Object ret) throws Throwable {// 处理完请求,返回内容log.info("RESPONSE : " + ret);InvokeLog invokeLog = invokelog.get();invokeLog.setResponse(ret.toString());invokeLog.setTime((System.currentTimeMillis()-time.get()));invokeLogMapper.insert(invokeLog);}@After(value = "invokeLog()")public void after(){}
}

/*** @program: beidou* @description: 注解文件* @author: shengkai* @create: 2018-08-24 08:59**/
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface InvokeLog {String name() default "";String description() default "";boolean printReturn() default true;
}

  

注意:遇到aop一直不生效的问题,是因为切面类没有被spring启动类管理,解决:扫面切面类所在包
三,在需要记录日志的controller接口上加入自定义注解即可

转载于:https://www.cnblogs.com/shengkai126126/p/10986587.html

springboot aop记录日志相关推荐

  1. 基于SpringBoot的AOP记录日志

    基于SpringBoot的AOP记录日志 package com.pgeneral.dlabs.sop.aop;import java.lang.annotation.*;/*** @author Y ...

  2. 如何使用SpringBoot AOP 记录操作日志、异常日志?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:咫尺的梦想_w cnblogs.com/wm-dv/ ...

  3. SpringBoot+AOP实现多数据源动态切换

    SpringBoot+AOP实现多数据源动态切换 背景 设计总体思路 步骤 背景 系统后端需要访问多个数据库,现有的数据库连接配置写入配置文件中.后端需要从一个数据库的配置表里动态的读取其它mysql ...

  4. SpringBoot + AOP 统一处理日志

    Springboot + AOP 统一处理日志.然后系统日志持久化到文件保存起来,当程序方便发生问题的时候,能够快速.准确的定位到问题的所在.SpringBoot + Log4j 每天输出一个日志文件 ...

  5. SpringBoot+AOP(@Around)

    SpringBoot+AOP(@Around) 虽然SpringBoot很方便,可以使我们不太懂原理的情况下都可以轻松的写出一个CRUD的项目,但是SpringBoot的控制反转和依赖注入我们时时刻刻 ...

  6. SpringBoot AOP 记录操作日志、异常日志

    使用SpringBoot AOP 记录操作日志.异常日志 我们在做项目时经常需要对一些重要功能操作记录日志,方便以后跟踪是谁在操作此功能.在操作某些功能时也有可能会发生异常,但是每次发生异常要定位原因 ...

  7. springboot aop + logback + 统一异常处理 打印日志

    springboot aop + logback + 统一异常处理 打印日志 参考文章: (1)springboot aop + logback + 统一异常处理 打印日志 (2)https://ww ...

  8. SpringBoot AOP完全讲解二:统一处理请求日志

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/80669451 本文出自[赵彦军的博客] 前言 不了解 AOP 概念的同学,请先看 ...

  9. Spring-Boot + AOP实现多数据源动态切换

    2019独角兽企业重金招聘Python工程师标准>>> 最近在做保证金余额查询优化,在项目启动时候需要把余额全量加载到本地缓存,因为需要全量查询所有骑手的保证金余额,为了不影响主数据 ...

最新文章

  1. 最新OPhone 开发官网
  2. shell 死循环if判断_运维小技巧(2):shell函数
  3. 在校生如何快速提升竞争力
  4. Python 实现杨辉三角
  5. Go语言字符串和数组的相互转换
  6. 实例变量和静态变量(或类变量static)
  7. tomcat出现5个using_当猫咪出现这5个迹象,主人就要给猫咪换猫粮了
  8. 二十四种设计模式:责任链模式(Chain of Responsibility Pattern)
  9. 告别ASP.NET操作EXCEL的烦恼(总结篇)
  10. 储存管理系统c语言,C语言-图书管理系统-未做文件储存系统.docx
  11. sharepoint 2007,sharepoint 2010网站的备份还原
  12. 怎么在linux中运行gamess,桌面应用|在 Linux 中怎么运行 MS-DOS 游戏和程序
  13. 腾讯云学生服务器搭建个人网站——配置web开发环境详细步骤
  14. html5 span 点击选择,设置span标签不可点击技术分享
  15. pmap anon 内存泄露
  16. HP deskjet 2132 如何顺利在mac上使用
  17. ROSIntegration ROSIntegrationVision与虚幻引擎4(Unreal Engine 4)的配置
  18. beeline执行sql语句_beeline执行sql脚本我世界开挂
  19. hanoi塔 python
  20. 测量结果RSRP/SINR/RSRQ/RSSI

热门文章

  1. 原版英文书籍《Linux命令行》阅读记录2 | 在文件系统中翱翔
  2. 细说ASP.NET Forms身份认证
  3. 分页池内存持续增长_鸿蒙内核源码分析(从进程/线程视角看内存)
  4. 王道 —— 操作系统的概念(定义)、功能和目标
  5. 多元正态分布、多元t分布中的行列式求解 Java
  6. 傅里叶变换对噪声进行频谱分析
  7. Vert x开发指南
  8. 如何在Ubuntu上安装最新版本的Node js
  9. Delphi 7下IGDIPlus库的使用
  10. 鼎信诺oracle_鼎信诺审计系统操作说明