java 拦截器 日志_log4j日志记录拦截器

本文介绍了一个Java实现的日志拦截器,使用Log4j记录HTTP请求的详细信息,包括开始计时、Controller、Method、Params、URI等,并在请求完成后记录执行时间和资源消耗情况。
摘要由CSDN通过智能技术生成

package com.bin.common;

import java.io.PrintWriter;

import java.io.StringWriter;

import java.text.SimpleDateFormat;

import java.util.Arrays;

import java.util.Map;

import java.util.Map.Entry;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import org.springframework.core.NamedThreadLocal;

import org.springframework.web.method.HandlerMethod;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

/**

* 日志记录

* @author wb

*/

public class LogInterceptor implements HandlerInterceptor {

public static final Logger LOGGER = Logger.getLogger(LogInterceptor.class);

private static final ThreadLocalstartTimeThreadLocal =

new NamedThreadLocal("ThreadLocal StartTime");

/**

* 请求参数转换

* @param map

* @return

*/

private String getParamString(Mapmap) {

StringBuffer sb = new StringBuffer();

for(Entrye:map.entrySet()){

sb.append(e.getKey()).append("=");

String[] value = e.getValue();

if(value != null && value.length == 1){

sb.append(value[0]).append("\t");

}else{

sb.append(Arrays.toString(value)).append("\t");

}

}

return sb.toString();

}

/**

* 将ErrorStack转化为String.

* @param e

* @return

*/

public static String getStackTraceAsString(Throwable e) {

if (e == null){

return "";

}

StringWriter stringWriter = new StringWriter();

e.printStackTrace(new PrintWriter(stringWriter));

return stringWriter.toString();

}

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

throws Exception {

System.out.println("===========================start=====================");

long startTime = System.currentTimeMillis();

request.setAttribute("startTime", startTime);

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

if (handler instanceof HandlerMethod) {

StringBuilder sb = new StringBuilder(1000);

sb.append("-----------------------开始计时:").append(new SimpleDateFormat("hh:mm:ss.SSS").format(startTime)).append("-------------------------------------\n");

HandlerMethod h = (HandlerMethod) handler;

sb.append("Controller: ").append(h.getBean().getClass().getName()).append("\n");

sb.append("Method    : ").append(h.getMethod().getName()).append("\n");

sb.append("Params    : ").append(getParamString(request.getParameterMap())).append("\n");

sb.append("URI       : ").append(request.getRequestURI()).append("\n");

LOGGER.debug(sb.toString());

}

//        response.sendRedirect(request.getContextPath()+"/index.jsp");

return true;

}

@Override

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,

ModelAndView modelAndView) throws Exception {

System.out.println("============================2====================");

long startTime = (Long) request.getAttribute("startTime");

long endTime = System.currentTimeMillis();

long executeTime = endTime - startTime;

if(handler instanceof HandlerMethod){

StringBuilder sb = new StringBuilder(1000);

sb.append("CostTime  : ").append(executeTime).append("ms").append("\n");

sb.append("-------------------------------------------------------------------------------");

LOGGER.debug(sb.toString());

}

}

@Override

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)

throws Exception {

System.out.println("=============================3===================");

if (LOGGER.isDebugEnabled()){

long beginTime = startTimeThreadLocal.get();//得到线程绑定的局部变量(开始时间)

long endTime = System.currentTimeMillis();     //2、结束时间

long totle = beginTime - endTime;

//如果controller报错,则记录异常错误

if(ex != null){

LOGGER.debug("Controller异常: " + getStackTraceAsString(ex));

}

LOGGER.debug("计时结束:"+ new SimpleDateFormat("hh:mm:ss.SSS").format(endTime) + " 耗时:" + totle + " URI:" +

request.getRequestURI()+ " 最大内存: " +Runtime.getRuntime().maxMemory()/1024/1024+ "m  已分配内存: " +Runtime.getRuntime().totalMemory()/1024/1024+ "m  已分配内存中的剩余空间: " +Runtime.getRuntime().freeMemory()/1024/1024+ "m  最大可用内存: " +

(Runtime.getRuntime().maxMemory()-Runtime.getRuntime().totalMemory()+Runtime.getRuntime().freeMemory())/1024/1024 + "m");

startTimeThreadLocal.remove();

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值