springcloud 日誌列印呼叫方法名稱
阿新 • • 發佈:2019-01-29
公司新專案用的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中;