日志处理
记录日志内容
- 请求URL
- 访问者IP
- 调用方法classMethod
- 参数args
- 返回内容
在项目中创建子包aspect
在子包中创建类LogAspect
加入注解
@Aspect//切面注解
@Component//让SpringBoot扫描到这个对象
//这两个注解是必须的
加上注解,通过这个注解声明他是一个切面,拦截controller下所有控制器
@Pointcut("execution(* net.yq.springbootblog.controller.*.*(..))")
加上这些,用处都在注释里面了
//测试--通过这样一个方法来在切面之前来执行,所以要声明一个before
@Before("log()")
public void doBefore(){
logger.info("----------doBefore-----------");
}
//执行之后
@After("log()")
public void doAfter(){
logger.info("----------doAfter-----------");
}
//方法执行完返回后去拦截,
@AfterReturning(returning = "result",pointcut = "log()")//捕获各个方法返回的内容
public void doAfterRuturn(Object result){
logger.info("Result : {}" , result);
}
接下来去indexController中去测试
将之前定义的先注释掉
在GetMapping
中定义两个参数
在下面也要定义index(@PathVariable Integer id,@PathVariable String name)
弄完后重构再测试地址栏输入http://127.0.0.1:8080/3/hello
效果为
查看控制台输出
现在获取url,ip等信息
在切面中定义这样一个方法
private class RequestLog{
private String url;
private String ip;
private String classMethod;
private Object args;
public RequestLog(String url, String ip, String classMethod, Object args) {
this.url = url;
this.ip = ip;
this.classMethod = classMethod;
this.args = args;
}
@Override
public String toString() {
return "{" +
"url='" + url + '\'' +
", ip='" + ip + '\'' +
", classMethod='" + classMethod + '\'' +
", args=" + args +
'}';
}
}
然后修改dobefore
@Before("log()")
public void doBefore(JoinPoint joinPoint){
ServletRequestAttributes attributes= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
String url = request.getRequestURL().toString();
String ip = request.getRemoteAddr();
String classMethod = joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName();
Object[] args = joinPoint.getArgs();
RequestLog requestLog = new RequestLog(url,ip,classMethod,args);
logger.info("Request : {}",requestLog);
}
修改完后重新跑一次
然后再访问,查看控制台输出
至此,日志处理就弄完了。
结束