1.日志处理的内容包括
1.请求url
2.访问者ip
3.调用方法classMethod
4.参数args
5.返回内容
2.在com.lrm.blog目录下建立一个aspect包,进而建立一个LogAspect类
package com.lrm.blog.aspect;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LogAspect {
// 日志记录器
private final Logger logger = LoggerFactory.getLogger(this.getClass());
// 定义切面
// @Pointcut表示“通过此注解 声明此空方法是是一个切面”
// execution(*com.lrm.blog.web.*.*(..))该切面拦截
// com.lrm.blog.web“此目录下的” .*.* “所有类所有方法” (..)“所有参数”
@Pointcut("execution(* com.lrm.blog.web.*.*(..))")
public void log(){}
// @Before("log()")表示在切面之前拦截
@Before("log()")
public void doBefore(){
// logger.info表示使用拦截器拦截
logger.info("-----方法之前----");
}
@After("log()")
public void doAfter(){
logger.info("------方法之后-----");
}
//返回的参数
@AfterReturning(returning ="result" ,pointcut = "log()")
public void doAfterRuturn(Object result){
logger.info("-----返回过程中拦截的内容:",result);
}
}
然后在控制器中设置
package com.lrm.blog.web;
import com.lrm.blog.NootFoundException;
import javassist.NotFoundException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@Controller
public class indexController {
// 设置参数/{id}/{name}
@GetMapping("/{id}/{name}")
// 加注解@PathVariable Integer id,@PathVariable String name
public String index(@PathVariable Integer id,@PathVariable String name){
System.out.println("-----index-------");
return "index";
}
}
3.通过http://127.0.0.1:8080/1/kkk 访问 ( “1和kkk”是随机输入的
)这时在查看日志
4.在切面之前如何获取“url ip classMethods args”
步骤;
1、建一个内部类
private class RequestLog{
private String url;
private String ip;
private String classMethods;
private Object []args;
public RequestLog(String url, String ip, String classMethods, Object[] args) {
this.url = url;
this.ip = ip;
this.classMethods = classMethods;
this.args = args;
}
@Override
public String toString() {
return "RequestLog{" +
"url='" + url + '\'' +
", ip='" + ip + '\'' +
", classMethods='" + classMethods + '\'' +
", args=" + Arrays.toString(args) +
'}';
}
}
2.然后在切面之前的方法上进行相关的设置
@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);
}