springcloud 日志打印调用方法名称

公司新项目用的springcloud框架,之前并没有接触过,在使用的时候,发现consule只打印SQL日志和logger.info();里的内容,并没有我想要的东西,比如:调用的是哪个方法,用户id等信息,所以从网上找了各种解决方法,现把代码贴上;

下面这个是一个自定义的日志拦截器,继承了HandlerInterceptorAdapter

package com.*****;

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.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.***.common.utils.DateUtils;


/**
 * 日志拦截器
 * @author szh
 * @version 2018-11-16
 */
public class LogInterceptor extends HandlerInterceptorAdapter {
    private static final Logger LOGGER = LoggerFactory.getLogger(LogInterceptor.class);

	private static final ThreadLocal startTimeThreadLocal =
			new NamedThreadLocal("ThreadLocal StartTime");
	
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, 
			Object handler) throws Exception {
			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 response, 
			Object handler, 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 SimpleDateFormat("hh:mm:ss.SSS").format(endTime), DateUtils.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); 
		}
		
	}

}

 继承HandlerInterceptorAdapter,重写里面的三个方法,preHandle方法,在参数发送到controller方法之前,可以打印出你想要的东西,我这只配置了方法名称,开始时间,如果有别的需求,可以再这个方法里加,比如用户id,可以用自己系统获取当前用户的方法,查到用户id,并显示出来;别的我就不解释了~~

然后再新建一个自定义类,实现WebMvcConfigurationSupport,贴上代码:

package com.***;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
 
 /**
  *Spring Mvc的配置类。
  * @author ***
  *
  */
//@Configuration ==>配置类并且会将该类作为一个SpringBean添加到IOC容器内
@Configuration
public class WebAppConfigurer extends WebMvcConfigurationSupport{
 
	/**
	 * 添加LogInterceptor 日志拦截器
	 * @param  InterceptorRegistry 拦截器注册器
	 */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LogInterceptor()).addPathPatterns("/**"); // 添加拦截器 以及 拦截器规则
        super.addInterceptors(registry);
    }
}
 

继承WebMvcConfigurationSupport,这个其实相当于之前springMVC.xml配置文件,但是springcloud没有这方面的配置文件,所以得写成.java形式,将日志拦截器加到spring的ioc中;

你可能感兴趣的:(随记)