公司新项目用的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<Long> startTimeThreadLocal =
new NamedThreadLocal<Long>("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中;