SpringBoot切面应用-输出接口调用日志
在微服务开发过程中,需要记录每个restful接口的调用日志信息,作为问题定位分析辅助数据。通过切面技术,实现该功能,不侵入业务代码逻辑。下面给一个demo样例。pom.xml配置<dependency><groupId>org.springframework.boot</groupId&
·
在微服务开发过程中,需要记录每个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测试调用接口,可以看到输出的日志信息
更多推荐
已为社区贡献3条内容
所有评论(0)