package com.nis.interceptor; import java.text.SimpleDateFormat; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.core.NamedThreadLocal; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import com.nis.util.DateUtils; import com.nis.util.LogUtils; import com.nis.web.service.BaseService; public class LogInterceptor extends BaseService implements HandlerInterceptor{ private static final ThreadLocal timeThreadLocal = new NamedThreadLocal("ThreadLocal StartTime"); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { long beginTime = System.currentTimeMillis();//1、开始时间 timeThreadLocal.set(beginTime); //线程绑定变量(该数据只有当前请求的线程可见) if (logger.isDebugEnabled()){ logger.debug("开始计时: {} 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) throws Exception { if (modelAndView != null){ logger.info("ViewName: " + modelAndView.getViewName()); } } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { long beginTime = timeThreadLocal.get();//得到线程绑定的局部变量(开始时间) long endTime = System.currentTimeMillis(); //2、结束时间 long consumerTime = endTime - beginTime; // 打印JVM信息。 if (logger.isDebugEnabled()){ Object[] params = new Object[]{ new SimpleDateFormat("hh:mm:ss.SSS").format(endTime) , DateUtils.formatDateTime(consumerTime) ,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}; logger.debug("计时结束:{} 耗时:{} URI: {} 最大内存: {}m 已分配内存: {}m 已分配内存中的剩余空间: {}m 最大可用内存: {}m",params); } // 保存日志 LogUtils.saveLog(request, handler, ex, null, consumerTime); } }