概述
接到的需求是给请求和返回加日志 直接入库,方便排查问题,首先想到的是用拦截器做一下拦截,这个时候遇到了从请求头body中拿 的json 数据时 只能读取一次的问题,参考了这篇博客,主要是通过一个类包一层request 在filter 中传播, 之后遇到了在响应中拿不到数据的,又上网找了一下别的博客 ,最后还是通过了通过切面加注解的方式来做日志记录. aop 切面 什么的概述什么的 应该都知道了 下面直接就是操作流程
- 首先pom 文件中引入 切面依赖
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.0</version>
</dependency>
- 创建一个注解
/**
* controller层日志打印注解
*
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({
ElementType.METHOD})
public @interface MethodLogger {
/**
* 日志打印类型, 默认请求日志全部打印
*
* @return
*/
LogTypeEnum logType() default LogTypeEnum.FULL;
}
- 创建一个切面
/**
* 记录日志类
*
* @author dzw
*/
@Aspect
@Component
@Slf4j
public class LoggerHandler {
@Resource
CallLogBoleService callLogBoleService;
/**
* 切点 --- 包含HttpLogger注解
*/
@Pointcut("@annotation(com.jumstc.fengyu.fy3rd.aspect.MethodLogger)")
protected void methodLogger() {
}
@Around("methodLogger()")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
// 获取request
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
long start = System.currentTimeMillis();
String method = request.getMethod();
StringBuffer requestURL = request.getRequestURL();
String data = "";
// 这是业务逻辑
if (requestURL.toString().contains("api")) {
method = request.getParameter("method");
//以前的接口 参数在请求中
data = request.getParameter("data");
}else {
//新版的 走post 的
method = joinPoint.getSignature().getName();
data = JsonUtil.toString(joinPoint.getArgs()[0]);
}
//这里就是开始执行方法 然后拿到返回值
Object result = joinPoint.proceed();
JSONObject jsonObject = JSONObject.parseObject(JSONUtil.toJsonStr(result));
String code = jsonObject.getString("code");
String msg = jsonObject.getString("msg");
long endTime = System.currentTimeMillis();
log.info("请求方法{},耗时{}",method,endTime-start);
try {
//记录
callLogBoleService.insert(method, data, CallLogBoleModel.REQUEST_LAUNCH_TYPE_BOLE, code,
msg);
} catch (Exception e) {
log.error("记录请求日志出错,method:{},args{}", method,data);
}
return result;
}
}
- 在需要的controller 层方法上加注解
/**
*
*/
@RequestMapping(value = "/batchOrderState", produces = "application/json", method = RequestMethod.POST)
@ResponseBody
@MethodLogger
public R batchOrderState(@RequestBody BoleOrderDefaultRequest defaultRequest) {
R r = defaultRequest.checkParam();
if (R.isFail(r)) {
return r;
}
//业务代码
return R.ok();
}
还有一个博客 可以直接加日志
如果是想在所有的方法上面加记录 就没有必要用注解加切面 就直接切面就好了