拦截器示例之日志记录

  1. xxx-servlet.xml配置

    <mvc:interceptors>
            <mvc:interceptor>
                <mvc:mapping path="/**" />
                <bean class="exam.njxzc.Interceptor.AllInterceptor" />
            </mvc:interceptor>
        </mvc:interceptors>
  2. AllInterceptor.java

    import java.text.SimpleDateFormat;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    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;
    
    public class AllInterceptor implements HandlerInterceptor{
        protected Logger logger = LoggerFactory.getLogger(getClass());
        //定义线程本地变量,这里的NamedThreadLocal只是1个带name属性的ThreadLocal:
        private static final ThreadLocal<Long> startTimeThreadLocal =
                new NamedThreadLocal<Long>("ThreadLocal StartTime");
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                Object handler) throws Exception {
            if (logger.isDebugEnabled()){
                long beginTime = System.currentTimeMillis();//1、开始时间  
                startTimeThreadLocal.set(beginTime);        //线程绑定变量(该数据只有当前请求的线程可见)  
                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 resonse, Object handle, Exception ex)
                throws Exception {
            // 打印JVM信息。
                if (logger.isDebugEnabled()){
                    long beginTime = startTimeThreadLocal.get();//得到线程绑定的局部变量(开始时间)  
                    long endTime = System.currentTimeMillis();  //2、结束时间  
                    logger.debug("计时结束:{}  耗时:{}  URI: {}  最大内存: {}m  已分配内存: {}m  已分配内存中的剩余空间: {}m  最大可用内存: {}m",
                            new Object[]{
                            new SimpleDateFormat("hh:mm:ss.SSS").format(endTime), 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}); 
                }
        }
    
        /**
         * 转换为时间(天,时:分:秒.毫秒)
         * @param timeMillis
         * @return
         */
        private static String formatDateTime(long timeMillis){
            long day = timeMillis/(24*60*60*1000);
            long hour = (timeMillis/(60*60*1000)-day*24);
            long min = ((timeMillis/(60*1000))-day*24*60-hour*60);
            long s = (timeMillis/1000-day*24*60*60-hour*60*60-min*60);
            long sss = (timeMillis-day*24*60*60*1000-hour*60*60*1000-min*60*1000-s*1000);
            return (day>0?day+",":"")+hour+":"+min+":"+s+"."+sss;
        }
    }
  3. 测试运行

    03:47:42,507 DEBUG [exam.njxzc.Interceptor.AllInterceptor] -开始计时: 03:47:42.506  URI: /exammanage/listrooms.do
    03:47:42,939  INFO [exam.njxzc.Interceptor.AllInterceptor] -ViewName: jsonView
    03:47:42,959 DEBUG [exam.njxzc.Interceptor.AllInterceptor] -计时结束:03:47:42.958  耗时:0:0:0.452  URI: /exammanage/listrooms.do  最大内存: 247m  已分配内存: 168m  已分配内存中的剩余空间: 79m  最大可用内存: 159m
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值