springboot 日志拦截器, 用于记录请求的时间

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();

            // 线程绑定变量(该数据只有当前请求的线程可见)

            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) {

    }

    @Override

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response,

                                Object handler, Exception ex) {

        // 打印JVM信息。

        if (logger.isDebugEnabled()) {

            // 得到线程绑定的局部变量(开始时间)

            long beginTime = startTimeThreadLocal.get();

            // 2、结束时间

            long endTime = System.currentTimeMillis();

            logger.debug("计时结束:{}  耗时:{}  URI: {}  最大内存: {}m  已分配内存: {}m  已分配内存中的剩余空间: {}m  最大可用内存: {}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);

        }

    }

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,765评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,923评论 18 139
  • 1 android三种数据持久化存储技术 (1)文件存储:简单,不做格式化处理,适用于文本文件、二进制文件 (2)...
    努力科研的小树蛙阅读 610评论 0 0
  • 月升,人独坐。风起,叶漂泊。嗟叹红尘谁人知,荷塘一对鸳映过。昨日黄花皆已落,莫,莫,莫! 相见,似无语。不见,更落...
    和尘云阅读 381评论 0 1
  • 还在上小学的时候,对工作场景的认识就是,坐在空调室,面对电脑,一杯茶 ,一份报,一把椅子坐一天,所以一直对工作的印...
    王玲_阅读 223评论 0 1