package com.fioc.ect.fproject.web.interceptors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.NamedThreadLocal;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.fioc.ect.fproject.utils.DateUtil;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.text.SimpleDateFormat;
/**
* @Author wulei
* @Title: LogInterceptor
* @Description: 日志攔截器, 用于記錄請求的時間
* @Date 2018/10/25 13:14
*/
public class LogInterceptor implements HandlerInterceptor {
? ? /**
? ? * logger
? ? */
? ? private static final Logger logger = LoggerFactory.getLogger(LogInterceptor.class);
? ? private static final ThreadLocal<Long> startTimeThreadLocal = new NamedThreadLocal<>("ThreadLocal StartTime");
? ? @Override
? ? public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
? ? ? ? ? ? ? ? ? ? ? ? ? ? Object handler) {
? ? ? ? if (logger.isDebugEnabled()) {
? ? ? ? ? ? // 1析二、開始時間
? ? ? ? ? ? long beginTime = System.currentTimeMillis();
? ? ? ? ? ? // 線程綁定變量(該數(shù)據(jù)只有當(dāng)前請求的線程可見)
? ? ? ? ? ? startTimeThreadLocal.set(beginTime);
? ? ? ? ? ? logger.debug("開始計(jì)時: {}? URI: {}", new SimpleDateFormat("hh:mm:ss.SSS")
? ? ? ? ? ? ? ? ? ? .format(beginTime), request.getRequestURI());
? ? ? ? }
? ? ? ? return true;
? ? }
? ? @Override
? ? public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
? ? ? ? ? ? ? ? ? ? ? ? ? ModelAndView modelAndView) {
? ? }
? ? @Override
? ? public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Object handler, Exception ex) {
? ? ? ? // 打印JVM信息。
? ? ? ? if (logger.isDebugEnabled()) {
? ? ? ? ? ? // 得到線程綁定的局部變量(開始時間)
? ? ? ? ? ? long beginTime = startTimeThreadLocal.get();
? ? ? ? ? ? // 2尘惧、結(jié)束時間
? ? ? ? ? ? long endTime = System.currentTimeMillis();
? ? ? ? ? ? logger.debug("計(jì)時結(jié)束:{}? 耗時:{}? URI: {}? 最大內(nèi)存: {}m? 已分配內(nèi)存: {}m? 已分配內(nèi)存中的剩余空間: {}m? 最大可用內(nèi)存: {}m",
? ? ? ? ? ? ? ? ? ? new SimpleDateFormat("hh:mm:ss.SSS").format(endTime), DateUtil.formatDateTime(endTime - beginTime),
? ? ? ? ? ? ? ? ? ? request.getRequestURI(), Runtime.getRuntime().maxMemory() / 1024 / 1024,
? ? ? ? ? ? ? ? ? ? Runtime.getRuntime().totalMemory() / 1024 / 1024, Runtime.getRuntime().freeMemory() / 1024 / 1024,
? ? ? ? ? ? ? ? ? ? (Runtime.getRuntime().maxMemory() - Runtime.getRuntime().totalMemory() + Runtime.getRuntime().freeMemory()) / 1024 / 1024);
? ? ? ? }
? ? }
}