如何将所有的通过 url 的请求参数以及返回结果都输出到日志中?
如果在 controller 的类中每个方法名都写一个 log 输出肯定是不明智的选择
使用 spring 的 AOP 功能即可完成
1. 在 pom.xml 中添加 aspect 依赖包
- <!-- aop -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-aop</artifactId>
- </dependency>
2. 添加全局的 webLogAspect 类
- package com.king.app;
- import java.util.Enumeration;
- import javax.servlet.http.HttpServletRequest;
- import org.aspectj.lang.JoinPoint;
- import org.aspectj.lang.annotation.AfterReturning;
- import org.aspectj.lang.annotation.Aspect;
- import org.aspectj.lang.annotation.Before;
- import org.aspectj.lang.annotation.Pointcut;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.stereotype.Component;
- import org.springframework.web.context.request.RequestContextHolder;
- import org.springframework.web.context.request.ServletRequestAttributes;
- @Aspect
- @Component
- public class WebLogAspect {
- private Logger logger = LoggerFactory.getLogger(getClass());
- @Pointcut("execution(public * com.king.controller..*.*(..))")
- public void webLog(){
- }
- @Before("webLog()")
- public void doBefore(JoinPoint joinPoint){
- ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
- HttpServletRequest request = attributes.getRequest();
- // 记录下请求内容
- logger.info("URL :" + request.getRequestURL().toString());
- logger.info("HTTP_METHOD :" + request.getMethod());
- logger.info("IP :" + request.getRemoteAddr());
- Enumeration<String> enu = request.getParameterNames();
- while (enu.hasMoreElements()) {
- String name = (String) enu.nextElement();
- logger.info("name:{},value:{}", name, request.getParameter(name));
- }
- }
- @AfterReturning(returning = "ret", pointcut = "webLog()")
- public void doAfterReturning(Object ret) throws Throwable {
- // 处理完请求, 返回内容
- logger.info("RESPONSE :" + ret);
- }
- }
- @Pointcut("execution(public * com.king.controller..*.*(..))")
上面这段注解的意思如下:
1) execution(): 表达式主体
2) 第一个 public * 号: 表示返回类型, * 号表示所有的类型
3) 包名: 表示需要拦截的包名, 后面的两个句点表示当前包和当前包的所有子包, com.king.controller 包子孙包下所有类的方法
4) 第二个 * 号: 表示类名,* 号表示所有的类
5) *(..): 最后这个星号表示方法名,* 号表示所有的方法, 后面括弧里面表示方法的参数, 两个句点表示任何参数
3. 最后在 App.class 中添加 com.king.app 的组件扫描
最后测试添加用户, 则可在日志中看到如下信息:
来源: http://www.bubuko.com/infodetail-2495947.html