摘要:介紹中包含的可以被同一線程中執行的代碼所訪問內容。當前線程的子線程會繼承其父線程中的的內容。記錄日志時,只需要從中獲取所需的信息即可。作用使用來記錄日志,可以規范多開發下日志格式。
介紹:
MDC 中包含的可以被同一線程中執行的代碼所訪問內容。當前線程的子線程會繼承其父線程中的 MDC 的內容。記錄日志時,只需要從 MDC 中獲取所需的信息即可。
作用:
使用MDC來記錄日志,可以規范多開發下日志格式。
一:新建線程處理類 ThreadContext
import java.io.Serializable; import java.util.HashMap; import java.util.Map; import java.util.Optional; /** * 線程上下文 * * @date 2017年3月1日 * @since 1.0.0 */ public class ThreadContext { /** * 線程上下文變量的持有者 */ private final static ThreadLocal
二:添加工具類TraceUtil
import java.util.UUID; import org.slf4j.MDC; import ThreadContext; /** * trace工具 * * @date 2017年3月10日 * @since 1.0.0 */ public class TraceUtil { public static void traceStart() { ThreadContext.init(); String traceId = generateTraceId(); MDC.put("traceId", traceId); ThreadContext.putTraceId(traceId); } public static void traceEnd() { MDC.clear(); ThreadContext.clean(); } /** * 生成跟蹤ID * * @return */ private static String generateTraceId() { return UUID.randomUUID().toString(); } }
三:添加ContextFilter,對于每個請求隨機生成RequestID并放入MDC
import java.io.IOException; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.web.filter.OncePerRequestFilter; import com.pingan.manpan.common.util.TraceUtil; import com.pingan.manpan.user.dto.ThreadContext; import com.pingan.manpan.web.common.surpport.IpUtils; /** * 上下文Filter * * @date 2017/3/10 * @since 1.0.0 */ //@Order 標記組件的加載順序 @Order(Ordered.HIGHEST_PRECEDENCE) public class ContextFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { try { ThreadContext.putClientIp(IpUtils.getClientIp(request)); TraceUtil.traceStart(); filterChain.doFilter(request, response); } finally { TraceUtil.traceEnd(); } } }
四:在webConfiguriation注冊filter
/** * 請求上下文,應該在最外層 * * @return */ @Bean public FilterRegistrationBean requestContextRepositoryFilterRegistrationBean() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(new ContextFilter()); filterRegistrationBean.addUrlPatterns("/*"); return filterRegistrationBean; }
五:修改log4j日志配置文件,設置日志traceId
${FILE_LOG_PATTERN} ${LOG_FILE}${LOG_FILE_SUFFIX} ${LOG_FILE}.%d{yyyy-MM-dd}${LOG_FILE_SUFFIX} 127.0.0.1 local6 514 ${FILE_LOG_PATTERN}
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68984.html
摘要:當前線程的子線程會繼承其父線程中的的內容。若希望在線程池與主線程間傳遞,需配合和使用。 一、背景 開發排查系統問題用得最多的手段就是查看系統日志,在分布式環境中一般使用ELK來統一收集日志,但是在并發大時使用日志定位問題還是比較麻煩,由于大量的其他用戶/其他線程的日志也一起輸出穿行其中導致很難篩選出指定請求的全部相關日志,以及下游線程/服務對應的日志。 ? 二、解決思路 每個請求都使...
摘要:默認情況下,如果使用,則使用進行日志記錄,還包括適當的路由,以確保使用或的依賴庫都能正確工作。分隔符,用于區分實際日志消息的開始。 26. 日志記錄 Spring Boot為所有內部日志記錄使用Commons Logging,但開放底層日志實現,提供了Java Util Logging、Log4J2和Logback的默認配置,在每種情況下,日志記錄器都被預先配置為使用控制臺輸出,可選的...
摘要:介紹從版本開始,使用作為追蹤庫,為方便起見,在此處嵌入了的部分文檔。具有一個上下文,其中包含標識符,該標識符將放置在表示分布式操作的樹中的正確位置。追蹤通常由攔截器自動完成,在幕后,他們添加與他們在操作中的角色相關的標簽和事件。 Spring Cloud Sleuth特性 將trace和span ID添加到Slf4J MDC,因此你可以在日志聚合器中從給定的trace或span提取...
摘要:底層是一個的散列表可擴容的數組,并采用開放地址法來解決沖突。稍后討論方法每個對象都有一個值,每初始化一個對象,值就增加一個固定的大小。因此在使用的時候要手動調用方法,防止內存泄漏。 ThreadLocal定義 先看JDK關于ThreadLocal的類注釋: This class provides thread-local variables. These variables diffe...
閱讀 2620·2021-10-12 10:12
閱讀 778·2019-08-29 17:25
閱讀 2782·2019-08-29 17:24
閱讀 3207·2019-08-29 17:19
閱讀 1792·2019-08-29 15:39
閱讀 3035·2019-08-26 16:50
閱讀 1984·2019-08-26 12:17
閱讀 2694·2019-08-26 12:16