當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
自定义SpringBoot start 自动打印日志
生活随笔
收集整理的這篇文章主要介紹了
自定义SpringBoot start 自动打印日志
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.新建Maven項目
項目創建成功了
然后添加文件
依賴:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- 在編譯時會自動收集配置類的條件,寫到一個 META-INF/spring-autoconfigure-metadata.properties中--><dependency><groupId> org.springframework.boot </groupId><artifactId> spring-boot-autoconfigure-processor </artifactId><optional> true </optional></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.53</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><!-- 編譯時依賴springboot --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><scope>compile</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><scope>compile</scope></dependency><!--常用工具類 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><skip>true</skip></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><configuration><testFailureIgnore>true</testFailureIgnore></configuration></plugin></plugins></build>1.TraceLogFilter 過濾器
package com.logstart.filter;import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MDC;import org.springframework.stereotype.Component; import org.springframework.util.StopWatch;import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.Date; import java.util.UUID;/*** @author: YXY* @date: 2021/2/5 11:17* @Version 1.0*/@Component public class TraceLogFilter implements Filter {private static final Logger LOGGER = LoggerFactory.getLogger(TraceLogFilter.class);private final String TRACE_ID = "traceId";// 線程追蹤ID@Overridepublic void destroy() {MDC.remove(TRACE_ID);}@Overridepublic void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {String contentType = arg0.getContentType();if (!(arg0 instanceof HttpServletRequest) || (contentType != null && contentType.contains("multipart/form-data"))) {arg2.doFilter(arg0, arg1);return;}StopWatch sw = new StopWatch();String startDate= getTimeSSS();sw.start();MDC.put(TRACE_ID, UUID.randomUUID().toString().replaceAll("-", ""));HttpServletRequest req = (HttpServletRequest) arg0;FilterRequestWrapper xrw = new FilterRequestWrapper(req);// 防止流讀取一次后,Controller無法獲取流數據arg2.doFilter(xrw, arg1);sw.stop();String endDate= getTimeSSS();// 匯總請求信息數據LOGGER.info("測試---接口地址:[{}] 開始請求時間:[{}]", xrw.getRequestURI(), startDate);if(isNotEmpty(xrw.getQueryString())){LOGGER.info("測試---接口地址:[{}] 請求query參數:[{}]", xrw.getRequestURI(), xrw.getQueryString().replaceAll("\r\n", ""));}if(isNotEmpty(xrw.getBody())){LOGGER.info("測試---接口地址:[{}] 請求body參數:[{}]", xrw.getRequestURI(), xrw.getBody().replaceAll("\r\n", ""));}LOGGER.info("測試---接口地址:[{}] 結束請求時間:[{}]", xrw.getRequestURI(), endDate);LOGGER.info("測試---接口地址:[{}] 耗費時間:[{}ms]", xrw.getRequestURI(), sw.getTotalTimeMillis());}class FilterRequestWrapper extends HttpServletRequestWrapper {private String body;public FilterRequestWrapper(HttpServletRequest request) throws IOException {super(request);// 讀取數據StringBuffer sb = new StringBuffer();BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream(), "UTF-8"));char[] charBuffer = new char[128];int bytesRead = -1;while ((bytesRead = br.read(charBuffer)) > 0) {sb.append(charBuffer, 0, bytesRead);}body = sb.toString();}@Overridepublic ServletInputStream getInputStream() throws IOException {final ByteArrayInputStream bais = new ByteArrayInputStream(body.getBytes("UTF-8"));return new ServletInputStream() {@Overridepublic int read() throws IOException {return bais.read();}@Overridepublic boolean isFinished() {return false;}@Overridepublic boolean isReady() {return false;}@Overridepublic void setReadListener(ReadListener readListener) {}};}@Overridepublic BufferedReader getReader() throws IOException {return new BufferedReader(new InputStreamReader(this.getInputStream(), StandardCharsets.UTF_8));}public String getBody() {return this.body;}}//時間格式處理public static final String getTimeSSS(){return dateTimeNow("yyyy-MM-dd HH:mm:ss.SSS");}public static final String dateTimeNow(final String format) {return parseDateToStr(format, new Date());}public static final String parseDateToStr(final String format, final Date date) {return new SimpleDateFormat(format).format(date);}/*** * 判斷一個字符串是否為非空串** @param str String* @return true:非空串 false:空串*/public static boolean isNotEmpty(String str){return !isEmpty(str);}public static boolean isEmpty(String str){return isNull(str) || "".equals(str.trim());}public static boolean isNull(Object object){return object == null;} }2.RequestUrlFilterAutoConfiguration 自定義自動配置類
package com.logstart.configuration;import com.logstart.filter.TraceLogFilter; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;/*** @author: YXY* @date: 2021/6/19 13:40* @Version 1.0* .自定義自動配置類** @ConditionalOnClass(TraceLogFilter.class) 只有類路徑下存在TraceLogFilter才加載這個配置類* @ConditionalOnMissingBean(TraceLogFilter.class) 只有容器中沒有TraceLogFilter Bean的時候才注入*/ @Configuration @ConditionalOnClass(TraceLogFilter.class) public class RequestUrlFilterAutoConfiguration {@ConditionalOnMissingBean(TraceLogFilter.class)@Beanpublic FilterRegistrationBean<TraceLogFilter> requestUrlFilter() {FilterRegistrationBean<TraceLogFilter> registrationBean = new FilterRegistrationBean<>();registrationBean.setFilter(new TraceLogFilter());registrationBean.addUrlPatterns("/*");registrationBean.setName("traceLogFilter");registrationBean.setOrder(1);return registrationBean;}}2.EnableLogFilter 自定義注解 ,依賴本jar包后,可以在SpringBoot啟動類上添加此注解實現日志打印
package com.logstart.annotation;import com.logstart.configuration.RequestUrlFilterAutoConfiguration; import org.springframework.context.annotation.Import;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/*** @author: YXY* @date: 2021/6/19 13:44* @Version 1.0* 使自動配置類 RequestUrlFilterAutoConfiguration 生效的注解*/ @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Import(RequestUrlFilterAutoConfiguration.class) public @interface EnableLogFilter { }4 .spring.factories 這個是Springboot 自動掃描、自動裝配(可以不用自定義注解就實現自動打印)
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.logstart.configuration.RequestUrlFilterAutoConfiguration步驟3和4 選一個就行
3是需要添加了依賴后,在用的項目中啟動類上添加此注解才可以生效
4是自動化的 什么都不需要,只要添加了依賴就行
總結
以上是生活随笔為你收集整理的自定义SpringBoot start 自动打印日志的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不思议迷宫寄生龙宝宝怎么获得
- 下一篇: 自定义SpringBoot start