定義攔截器
public class LogTimeHandlerInterceptor extends HandlerInterceptorAdapter {
// 單例多線程 開始時(shí)間綁定在線程上
private ThreadLocal<Long> startTimeThreadLocal = new ThreadLocal<>();
private static final Logger log = LoggerFactory.getLogger("RequestTime");
//獲取請(qǐng)求前時(shí)間并放入startTimeThreadLocal
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
long start = System.currentTimeMillis();
startTimeThreadLocal.set(start);
return true;
}
//請(qǐng)求結(jié)束后計(jì)算出耗時(shí) 日志記錄相關(guān)信息
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
try {
if (handler instanceof HandlerMethod) {
HandlerMethod method = (HandlerMethod) handler;
String className = method.getBeanType().getName();
String methodName = method.getMethod().getName();
Long startTime = startTimeThreadLocal.get();
Long endTime = System.currentTimeMillis();
StringBuilder logs = new StringBuilder();
//可在此處獲取當(dāng)前用戶放日志信息里
logs.append(" IP:").append(HttpUtil.getIpAddress(request));//獲取請(qǐng)求地址IP 自己實(shí)現(xiàn)
logs.append(" ").append(className).append("::").append(methodName);
long time = endTime - startTime;
logs.append(" 耗時(shí):").append(time).append("(ms)");
log.info(logs.toString());
}
} finally {
//清理開始時(shí)間
startTimeThreadLocal.remove();
}
}
}
可以根據(jù)需求記錄更多信息,也可以把日子信息存入數(shù)據(jù)庫。
配置攔截器(基于springBoot)
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LogTimeHandlerInterceptor());
}
}
效果如下

image.png