AOP切面日志的使用方式
@Aspect
@Component
public class HttpAspect { private static final Logger logger = LoggerFactory.getLogger(HttpAspect.class);
//定义切点
@Pointcut("execution(public * com.example.springdemo.controller.*.*(..))")
public void log() {
} @Before("log()")
public void doBefore(JoinPoint joinPoint) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest(); StringBuilder httpInfo = new StringBuilder(); MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
// 请求的方法参数值
Object[] args = joinPoint.getArgs();
// 请求的方法参数名称
LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer();
String[] paramNames = u.getParameterNames(method);
String params = "";
if (args != null && paramNames != null) {
for (int i = 0; i < args.length; i++) {
params += " " + paramNames[i] + ": " + args[i];
}
}
//拼接参数请求报文
httpInfo.append("[{DATE=").append(DateUtils.convertDateTimeToString(new Date())).append("},{URI=").append(request.getRequestURI()).append("},{method=").append(request.getMethod())
.append("},{ip=").append(request.getRemoteAddr()).append("},{params="); if (!StringUtils.isEmpty(params)) {
httpInfo.append(JsonUtils.objectToJson(params));
}
httpInfo.append("}]");
logger.info("request = {}", httpInfo); } @After("log()")
public void doAfter() {
} /**
* 记录请求完成之后的响应体
*
* @param object
*/
@AfterReturning(returning = "object", pointcut = "log()")
public void doAfterReturning(Object object) {
logger.info("response={}", JsonUtils.objectToJson(object));
}
}