大致需求是这样的,用springmvc去实现restful的service,由于跟客户端(web,android,ios)进行调试时,想要知道对方传递过来的参数是什么样子的,希望用日志记录下来。但有些疑问:
希望大家能共同探讨,不惜赐教。感谢
使用 Spring 的 AOP,具体代码如下(仅做参考):
@Component
@Aspect
public class AopLog {
private static final Logger log = LoggerFactory.getLogger(AopLog.class);
// 提示信息格式
private final static String msg = "\r\nIP:{}\r\nURL:{}\r\nHTTP_METHOD:{}\r\nCLASS_METHOD:{}\r\nARGS:{}\r\nResult:{}\r\nConsuming:{}ms\r\n";
@Pointcut("execution(public * com.hong..*Controller.*(..))")
public void log() {
}
@Around("log()")
public Object before(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis(); // 方法开始执行的时间
String args = Arrays.toString(joinPoint.getArgs()); // 方法参数
String classMethod = joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName(); // 调用的方法
Object result = null;
/*
* 获取 request 信息
*/
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
String url = "", httpMethod = "", ip = "";
if(attributes != null) {
HttpServletRequest request = attributes.getRequest();
// 记录下请求内容
url = request.getRequestURL().toString();
httpMethod = request.getMethod();
ip = getIpAddr(request);
}
long methodEnd;
// 执行方法,如果有异常,则进行记录
try {
result = joinPoint.proceed();
} catch (Exception e) {
methodEnd = System.currentTimeMillis(); // 记录出现异常时的执行时间
result = e.getMessage();
log.error(msg, ip, url, httpMethod, classMethod, args, result, methodEnd - startTime, e);
throw e;
}
methodEnd = System.currentTimeMillis(); // 记录方法正常执行后时间
log.info(msg, ip, url, httpMethod, classMethod, args, result, methodEnd - startTime);
return result;
}
/**
* 获取客户端IP
* @param request HttpServletReqeust信息
* @return IP
*/
private String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
}
######
org.springframework.web.servlet.handler.HandlerInterceptorAdapter
不知道有用不
######现在就是用这种方式处理的,但是如果在interceptor里面读取了流里面的body内容,到达controller的时候,就读不到body了,因为流里面的内容被读取过就没有了######aop
aspectJ
######楼主解决了吗??求指点。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。