1. 程式人生 > >springcloud 日誌列印呼叫方法名稱

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<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中;