之前已经配置好日志系统,现在的想法是将页面上每个请求的信息都记录下了。包括url,参数,返回值,执行时间等。
我想到了spring的aop功能。
一、理论准备
有兴趣的可以参考一下这篇文章:Spring AOP详细介绍
一句话:切点通知切面。
二、新建LogAspect.java
@Aspect
@Component
public class LogAspect {
private static final Logger logger = LoggerFactory.getLogger(LogAspect.class);
/**
* @todo: 切点控制,所与的controller都要走这个切点
*/
@Pointcut("execution( * com.byk..controller.*.*(..))")//两个..代表所有子目录,最后括号里的两个..代表所有参数
public void logPointCut() {
}
/**
* @todo: 前置通知 在logPointCut() 方法前进行通知
*/
@Before("logPointCut()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 记录下请求内容
logger.info("请求地址 : " + request.getRequestURL().toString());
logger.info("请求方式 : " + request.getMethod());
logger.info("请求的类和方法 : " + joinPoint.getSignature().getDeclaringTypeName() + "."
+ joinPoint.getSignature().getName());
logger.info("参数 : " + Arrays.toString(joinPoint.getArgs()));
}
/**
* @todo: 后置通知获取返回值
*/
@AfterReturning(returning = "ret", pointcut = "logPointCut()")// returning的值和doAfterReturning的参数名一致
public void doAfterReturning(Object ret) throws Throwable {
// 处理完请求,返回内容(返回值太复杂时,打印的是物理存储空间的地址)
// logger.debug("返回值 : " + ret.toString());
logger.debug("返回值 : " + ret);
}
/**
* @todo: 环绕通知监控方法时间
*/
@Around("logPointCut()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
long startTime = System.currentTimeMillis();
Object ob = pjp.proceed();// ob 为方法的返回值
logger.info("耗时 : " + (System.currentTimeMillis() - startTime));
return ob;
}
}
三、访问
启动工程,浏览器访问。
控制台输出:
日志文件记录: