SpringBoot切面应用-输出接口调用日志

在微服务开发过程中,需要记录每个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测试调用接口,可以看到输出的日志信息

在这里插入图片描述

发布了113 篇原创文章 · 获赞 183 · 访问量 29万+

猜你喜欢

转载自blog.csdn.net/ylforever/article/details/83814879