在微服务开发过程中,需要记录每个restful接口的调用日志信息,作为问题定位分析辅助数据。通过切面技术,实现该功能,不侵入业务代码逻辑。下面给一个demo样例。

pom.xml配置

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

定义统一的接口返回结果模型

package com.elon.springbootdemo.model;
import java.io.Serializable;/*** 通用的响应模型。* @author elon* @version 2018年11月4日*/
public class ResponseModel <T> implements Serializable {private static final long serialVersionUID = 773236882872100177L;/*** 错误码。1是成功,0是失败。可定义其它错误码*/private int retCode = 1;/*** 错误信息*/private String errorMsg = "";/*** 操作结果*/private T result = null;@SuppressWarnings({ "rawtypes", "unchecked" })public static ResponseModel success(Object result) {ResponseModel rm = new ResponseModel();rm.setResult(result);return rm;}@SuppressWarnings("rawtypes")public static ResponseModel error(String errorInfo) {ResponseModel rm = new ResponseModel();rm.setErrorMsg(errorInfo);return rm;}public int getRetCode() {return retCode;}public void setRetCode(int retCode) {this.retCode = retCode;}public String getErrorMsg() {return errorMsg;}public void setErrorMsg(String errorMsg) {this.errorMsg = errorMsg;}public T getResult() {return result;}public void setResult(T result) {this.result = result;}
}

定义日志注解

package com.elon.springbootdemo.manager;import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 定义操作日志注解* @author elon* @version 2018年11月2日*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface OperatorLog {// 操作String operate();// 模块String module();
}

定义拦截操作日志的切面

package com.elon.springbootdemo.aop;import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;import com.elon.springbootdemo.manager.OperatorLog;
import com.elon.springbootdemo.model.ResponseModel;/*** 操作日志切面定义。* @author elon* @version 2018年11月4日*/
@Aspect
@Component
public class OperatorLogApsect {private static Logger logger = LogManager.getLogger(OperatorLogApsect.class);@Pointcut("@annotation(com.elon.springbootdemo.manager.OperatorLog)")public void operatorLog() {}@SuppressWarnings("rawtypes")@AfterReturning(returning="result", pointcut="operatorLog()&&@annotation(log)")public void afterReturn(JoinPoint joinPoint, ResponseModel result, OperatorLog log) {/*** 接口调用信息可以记日志,也可以写到数据库*/StringBuilder sb = new StringBuilder();sb.append("模块:").append(log.module());sb.append("|操作:").append(log.operate());sb.append("|接口名称:").append(joinPoint.getSignature().getName());sb.append("|错误码:").append(result.getRetCode());sb.append("|错误信息:").append(result.getErrorMsg());logger.info(sb.toString());}
}

在接口上增加操作日志注解

    @RequestMapping(value="/v1/query-user", method=RequestMethod.GET)@OperatorLog(operate="查询用户", module="用户管理")public ResponseModel queryUser(@RequestParam(value="user", required=true) String user) {log.info("[INFO]user info:" + user);log.warn("[WARN]user info:" + user);log.error("[ERROR]user info:" + user);return ResponseModel.success(null);}

通过postman测试调用接口,可以看到输出的日志信息

SpringBoot切面应用-输出接口调用日志相关推荐

  1. SpringBoot+MDC实现链路调用日志

    1.首先介绍什么是MDC MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j .logback及log4j2 提供的一种方便在多线程条件下记录日志的功能.MDC ...

  2. springboot切面配置

    springboot切面配置 文章目的 记录我网上学习切面的实现过程 此次只是在学习过程中,想要记录请求的过程的一些信息,还会继续学习改进.下面是实现过程: 切点 要实现切面,@Aspect注解不能少 ...

  3. SpringBoot 实现异步记录复杂日志

    点击关注公众号,利用碎片时间学习 1.背景 最近接手一个任务,需要给当前项目加一个较为复杂的日志.有多复杂呢? 要有日志类型.不同日志类型要有不同的操作和备注等.作为小白的我最开始的做法是在业务层写代 ...

  4. 工作经验:Java 系统记录调用日志,并且记录错误堆栈

    前言:现在有一个系统,主要是为了给其他系统提供数据查询接口的,这个系统上线不会轻易更新,更不会跟随业务系统的更新而更新(这也是有一个数据查询接口系统的原因,解耦).这时,这个系统就需要有一定的方便的线 ...

  5. 2.在某应用软件中需要记录业务方法的调用日志,在不修改现有业务类的基础上为每一个类提供一个日志记录代理类,在代理类中输出日志,例如在业务方法 method() 调用之前输出“方法 method() 被

    2.在某应用软件中需要记录业务方法的调用日志,在不修改现有业务类的基础上为每一个类提供一个日志记录代理类,在代理类中输出日志,例如在业务方法 method() 调用之前输出"方法 metho ...

  6. SpringBoot 2.1.15(17)---日志的使用

    一.日志框架 SpringBoot默认使用的的日志框架是slf4j + Logback 日志框架的统一 由于各个框架都有各自配套的日志框架,无法做到统一  为了统一日志框架为slf4j,可以进行以下操 ...

  7. 面向切面编程:操作日志

    在项目中,操作日志至关重要,操作日志记录的是:谁干了什么事: 我们可以利用面向切面编程实现操作日志的打印与记录: 1.首先,添加依赖: <!--spring aop 依赖--><de ...

  8. aop日志(记录方法调用日志)

    一,使用aop记录方法调用日志 1)使用注解与aop做方法调用日志,只需要把注解添加在要记录的方法上就可以,不会影响代码结构 2)实现思路 数据库表建立>>配置需要环境>>自定 ...

  9. springboot 指定 logback_spring boot与日志

    日志想必各位都不陌生了,虽然我们平时的学习当中只看看这个控制台的日志,但是其他方式也要去掌握哦.这次就来讲讲这个日志与spring boot摩擦的火花.一些简单的使用. 基本介绍我们首先来看看这个市面 ...

最新文章

  1. python自学需要哪些基础知识-零基础学Python应该学习哪些入门知识及学习步骤安排...
  2. Spring Boot 核心配置文件详解
  3. 静态函数一个有用的设计模式
  4. PHP用支付宝沙箱账号测试支付功能
  5. ubuntu16.04安装VMware网络配置
  6. 【Python学习】 - - 链表推导式[ 2*x for x in X ]、匿名函数、并行迭代
  7. mAP与IOU的简单介绍
  8. String s = new String(xyz)创建了几个实例你真的能答对吗?
  9. 周志华机器学习西瓜书速记第二章绪论模型评估与选择(二)
  10. CMU 15-213 Introduction to Computer Systems学习笔记(20) Concurrent Programming
  11. VS2008 SP1 安装卡在 VS90sp1-KB945140-X86-CHS的解决方法
  12. iOS 签名机制与证书
  13. 【VMWare通过vmdk文件创建虚拟机】
  14. android仿京东跑马灯,RecyclerView实现跑马灯效果
  15. oracle授权v$lock,访问V$LOCK视图Oracle 11g出现性能问题
  16. 【电脑技巧】如何使用dxdiag查看电脑信息(Win11)
  17. Mind+实现自定义用户库——TM1637数码管
  18. 理想汽车下“神坛”:抛弃对混动的执念,不得不转身?
  19. SpringBoot整合thymeleaf之模糊查询操作模块
  20. swapidc不能连接到主机_swapidc 安装教程 安装/启动 插件教程

热门文章

  1. [架构之路-5]:架构师 - 中国计算机技术职业资格(软考)考试是如何定义系统架构师?
  2. 有符号数和无符号数的范围
  3. 中国软件外包企业的出路
  4. pytorch矩阵运算
  5. linux的几个发行网站
  6. python创建一个文本文件、包含10行字符串、每行字符串由_Python2:使用正则表达式从文本文件中提取整行,子字符串来自anoth...
  7. 解决 用vue+vant 写顶部tab栏 做排班表的bug
  8. 微信小程序操作mysql_微信小程序:数据库操作
  9. 360路由器c301的官方固件和openwrt固件
  10. 手机通过QQ发送图片到电脑端,电脑接收不到且显示图裂