精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

MDC+Filter/Interceptor:用戶信息日志追蹤

云計算 分布式
本文將詳細介紹如何通過Filter?(過濾器) 或 Interceptor?(攔截器) 結合日志框架的MDC機制,實現用戶信息的自動注入與日志追蹤。

前言

在分布式系統或復雜業務系統中,日志是排查問題、追蹤業務流程的核心工具。但默認日志往往缺乏用戶維度的關聯信息,當出現問題時難以快速定位某個用戶的操作鏈路。本文將詳細介紹如何通過Filter(過濾器) 或 Interceptor(攔截器) 結合日志框架的MDC機制,實現用戶信息的自動注入與日志追蹤。

原理解析

在實現用戶信息追蹤前,需先理解三個核心技術組件的作用與協作邏輯:MDC、Filter、Interceptor。

MDC:日志上下文的容器

MDC 是 SLF4J及 Logback、Log4j2等日志框架提供的上下文工具,本質是基于ThreadLocal實現的線程級別的鍵值對存儲容器。其核心作用是:

  • 在請求處理線程中存儲臨時上下文信息(如用戶ID、用戶名、請求ID 等);
  • 日志輸出時自動從MDC中提取配置的鍵值,無需在每處日志打印代碼中手動傳入用戶信息;
  • 線程結束后自動清理上下文,避免內存泄漏(需手動保證清理邏輯)。

MDC核心API(以SLF4J為例):

// 向MDC中存入鍵值對(如用戶ID)
MDC.put("userId", "user_123456");
// 從MDC中獲取值
String userId = MDC.get("userId");
// 清空當前線程的MDC上下文(關鍵,必須執行)
MDC.clear();
Filter 與 Interceptor:請求鏈路的攔截器

圖片圖片

圖片

Filter和Interceptor均用于攔截HTTP請求,在請求處理前后執行自定義邏輯(如權限校驗、參數預處理),是注入MDC上下文的最佳切入點。

實踐方案

方案 1:基于 Filter+MDC 實現

自定義 MDC 過濾器
/**
 * 基于Filter的MDC用戶信息注入過濾器
 */
public class MdcUserFilter extends OncePerRequestFilter {

    // 定義MDC中用戶信息的鍵(需與日志配置一致)
    private static final String MDC_USER_ID = "userId";
    private static final String MDC_USER_NAME = "userName";

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) 
            throws ServletException, IOException {
        try {
            // 1. 從請求頭提取用戶信息(實際項目需替換為Token解析、Session獲取等邏輯)
            String userId = request.getHeader("X-User-Id");
            String userName = request.getHeader("X-User-Name");
            
            // 2. 注入MDC(若用戶未登錄,可存入默認值如"unknown")
            MDC.put(MDC_USER_ID, userId != null ? userId : "unknown");
            MDC.put(MDC_USER_NAME, userName != null ? userName : "unknown");
            
            // 3. 繼續執行請求鏈路(進入Controller層)
            filterChain.doFilter(request, response);
        } finally {
            // 4. 關鍵:請求結束后清空MDC,避免線程復用導致上下文污染(線程池場景必做)
            MDC.clear();
        }
    }
}
步驟 2:注冊 Filter 到 Spring 容器
@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<MdcUserFilter> mdcUserFilterRegistration() {
        FilterRegistrationBean<MdcUserFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new MdcUserFilter());
        // 攔截所有請求
        registrationBean.addUrlPatterns("/*");
        // 設置過濾器優先級(值越小優先級越高,確保先于其他業務過濾器執行)
        registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return registrationBean;
    }
}

方案 2:基于 Interceptor+MDC 實現

步驟 1:自定義 MDC 攔截器
/**
 * 基于Interceptor的MDC用戶信息注入攔截器
 */
public class MdcUserInterceptor implements HandlerInterceptor {

    private static final String MDC_USER_ID = "userId";
    private static final String MDC_USER_NAME = "userName";

    /**
     * 請求處理前執行:注入MDC
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 1. 提取用戶信息(邏輯與Filter一致,可復用工具類)
        String userId = request.getHeader("X-User-Id");
        String userName = request.getHeader("X-User-Name");
        
        // 2. 注入MDC
        MDC.put(MDC_USER_ID, userId != null ? userId : "unknown");
        MDC.put(MDC_USER_NAME, userName != null ? userName : "unknown");
        
        // 返回true:繼續執行后續鏈路(如Controller)
        returntrue;
    }

    /**
     * 請求完成后執行(無論是否拋異常):清空MDC
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 關鍵:清空MDC,避免線程池上下文污染
        MDC.clear();
    }
}
步驟 2:注冊 Interceptor 到 Spring MVC
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MdcUserInterceptor())
                // 攔截所有請求
                .addPathPatterns("/**")
                // 排除無需攔截的路徑(如登錄接口、靜態資源)
                .excludePathPatterns("/api/login", "/static/**", "/error");
    }
}

配置日志輸出 MDC 信息

<configuration>
    <!-- 控制臺輸出配置 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 日志格式:時間 [線程名] 日志級別 類名 - 用戶ID:xxx 用戶名:xxx 日志內容 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - userId:%X{userId} userName:%X{userName} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 文件輸出配置(按天滾動) -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/app.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/app.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory> <!-- 保留30天日志 -->
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - userId:%X{userId} userName:%X{userName} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 全局日志級別:INFO -->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </root>

    <!-- 業務包日志級別:DEBUG(按需調整) -->
    <logger name="com.example.business" level="DEBUG" additivity="false">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </logger>
</configuration>

線程池場景下的 MDC 傳遞

手動傳遞 MDC 上下文
public class AsyncMdcDemo {

    // 初始化線程池
    private static final ExecutorService executorService = Executors.newFixedThreadPool(5);

    public void doAsyncTask() {
        // 1. 獲取當前線程的MDC上下文(包含用戶信息)
        Map<String, String> mdcContext = MDC.getCopyOfContextMap();
        
        // 2. 提交異步任務到線程池
        executorService.submit(() -> {
            try {
                // 3. 子線程中注入MDC上下文
                if (mdcContext != null) {
                    MDC.setContextMap(mdcContext);
                }
                
                // 4. 異步業務邏輯(日志會自動包含用戶信息)
                log.info("執行異步任務:處理用戶訂單");
            } finally {
                // 5. 子線程結束后清空MDC
                MDC.clear();
            }
        });
    }
}
封裝線程池(避免重復代碼)
// Spring異步任務裝飾器:自動傳遞MDC
public class MdcTaskDecorator implements TaskDecorator {
    @Override
    public Runnable decorate(Runnable runnable) {
        // 獲取當前線程MDC上下文
        Map<String, String> mdcContext = MDC.getCopyOfContextMap();
        return () -> {
            try {
                // 子線程注入MDC
                if (mdcContext != null) {
                    MDC.setContextMap(mdcContext);
                }
                runnable.run();
            } finally {
                MDC.clear();
            }
        };
    }
}

// 配置Spring異步線程池(使用裝飾器)
@Configuration
@EnableAsync
public class AsyncConfig {
    @Bean
    public Executor asyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(25);
        // 設置MDC裝飾器
        executor.setTaskDecorator(new MdcTaskDecorator());
        executor.initialize();
        return executor;
    }
}

總結

通過Filter/Interceptor+MDC實現用戶信息追蹤,核心是 攔截請求→注入上下文→日志輸出→清理上下文 的閉環流程,其價值在于:

  • 無侵入式:無需在業務代碼中手動傳遞用戶信息到日志,降低開發成本;
  • 可追溯性:日志自動關聯用戶維度,快速定位單個用戶的操作鏈路;
  • 靈活性:支持全局或局部攔截,適配不同業務場景。
責任編輯:武曉燕 來源: 一安未來
相關推薦

2024-09-11 08:10:46

2024-05-16 12:24:53

2025-01-20 08:10:00

微服務架構SLF4J

2025-05-26 08:50:00

SLF4JMDC全鏈路追蹤

2012-02-21 09:30:26

微軟谷歌IE隱私設置

2025-10-10 08:58:13

2019-08-21 08:24:34

技術過濾器代碼

2021-11-03 17:04:11

攔截器操作Servlet

2024-12-06 10:43:27

2022-07-06 19:00:00

微服務框架鏈路

2017-03-01 15:18:16

2015-01-15 09:59:53

瀏覽器安全Cookie安全漏洞

2013-03-19 09:18:35

Cookie

2022-01-13 10:04:21

攔截器Interceptor過濾器

2021-05-10 10:00:23

iOS蘋果系統

2022-07-22 07:59:17

日志方案

2010-06-22 10:30:13

2021-05-13 17:02:38

MDC腳手架日志

2022-12-30 08:31:27

MDC查詢日志

2009-03-11 14:00:31

點贊
收藏

51CTO技術棧公眾號

娇小11一12╳yⅹ╳毛片| 777久久精品一区二区三区无码| 91精品国产乱码久久久张津瑜| 要久久爱电视剧全集完整观看| 欧美日韩中字一区| 久久男人资源站| 青梅竹马是消防员在线| 久久国产三级精品| 97**国产露脸精品国产| 女人黄色一级片| 国产乱人伦丫前精品视频| 色综合久久久久| 日韩欧美视频免费在线观看| 黄色的视频在线免费观看| 国产麻豆精品theporn| 日韩av观看网址| 99精品久久久久| 日本一区二区免费高清| 亚洲福利视频二区| av噜噜在线观看| 欧美成人影院| 亚洲va韩国va欧美va精品| 亚洲精品中字| 免费理论片在线观看播放老| 国产精品一区二区在线播放 | 蜜芽在线免费观看| wwwwxxxxx欧美| 成人蜜桃视频| 国产一区二区女内射| 美女网站久久| 97成人精品区在线播放| 免费在线观看黄视频| 久久一本综合| 在线视频精品一| 深爱五月激情网| 日韩欧美中文字幕电影| 欧美r级在线观看| 两女双腿交缠激烈磨豆腐| 欧美日韩国产网站| 色综合久久88色综合天天6 | 日本精品一区二区三区高清 久久| 精品人妻一区二区三区麻豆91| 人禽交欧美网站| 国产成人久久久精品一区| 日日夜夜综合网| 国产精品视区| 77777亚洲午夜久久多人| 国产系列精品av| 在线精品在线| 国内揄拍国内精品| 日产精品久久久久| 亚洲美女一区| 91精品国产91久久久久| 国产成人亚洲欧洲在线| 日韩亚洲国产欧美| 777精品视频| 国产精品suv一区二区三区| 亚洲精品日本| 91国内在线视频| 国产精品视频一区在线观看| 午夜亚洲影视| 国产精品久久久91| 亚洲一区二区天堂| 韩国一区二区在线观看| 99九九视频| 欧美一级特黄aaaaaa| 91视频精品在这里| 日本精品一区二区| 国产在线激情| 亚洲一区二区视频在线| 69sex久久精品国产麻豆| av资源在线| 色999日韩国产欧美一区二区| 国产精品69页| 成人在线视频www| 日韩视频在线永久播放| 强迫凌虐淫辱の牝奴在线观看| 欧美午夜寂寞| 日韩最新在线视频| 国产亚洲精品久久久久久无几年桃| 亚洲人成人一区二区三区| 欧美影院在线播放| 一级全黄少妇性色生活片| 国产乱子伦视频一区二区三区 | 国产一区二区视频在线观看| jizz国产视频| 久久伊99综合婷婷久久伊| 亚洲精品中文字幕乱码三区不卡| 日韩欧美一起| 在线看不卡av| 日本wwwxx| 国产精品一区高清| 久久天天躁狠狠躁老女人| 天海翼一区二区| 久久国产精品72免费观看| 国产成人一区二区三区免费看| 人成在线免费视频| 日韩理论片一区二区| 奇米精品一区二区三区| 欧美成人一二区| 日韩成人av一区| 影音先锋男人资源在线观看| 一区二区国产精品| 91日本在线观看| 欧美男男激情freegay| 亚洲精品乱码久久久久久日本蜜臀| 国产精品丝袜久久久久久消防器材 | 亚洲精品免费看| 能看的毛片网站| 美女av一区| 久久影院模特热| 成人h动漫精品一区二区下载| 国产成人av自拍| 亚洲国产综合自拍| 欧美第一视频| 亚洲第一福利网| 国产成人无码aa精品一区| 久久尤物视频| 久久久久久久久一区| 色老头在线观看| 欧美酷刑日本凌虐凌虐| 亚洲最大成人综合网| 一本久久综合| 国产精品日韩欧美一区二区三区| 国产丝袜在线| 欧美日韩亚洲国产综合| 国产一区二区三区四区五区六区 | 欧洲日韩成人av| 欧美一区二不卡视频| 亚洲男人的天堂在线aⅴ视频| 国产第一页视频| 亚洲精品国模| 韩国一区二区电影| 农村少妇久久久久久久| 亚洲自拍欧美精品| 中国特级黄色片| 欧美一区二区三区久久精品茉莉花| 国产精品视频一区国模私拍| 国产精品无码2021在线观看| 日韩欧美亚洲范冰冰与中字| 国产麻豆天美果冻无码视频 | 欧美中文字幕精品| 婷婷色在线视频| 午夜欧美2019年伦理| 欧美一级片在线免费观看| 欧美久久九九| 成人午夜电影在线播放| 国产乱码在线| 亚洲精品在线一区二区| 国产精品成人久久| 不卡视频免费播放| 国产精品后入内射日本在线观看| 卡通动漫国产精品| 欧美怡春院一区二区三区| 欧美男男同志| 欧美日韩美女一区二区| 永久av免费网站| 精品一区二区三区久久| 特级黄色录像片| 日韩精品免费视频一区二区三区 | 亚洲精品日韩久久久| 极品国产91在线网站| 国产日产欧美精品一区二区三区| 色七七在线观看| 99久久99久久精品国产片桃花| 91在线观看免费高清| 日本孕妇大胆孕交无码| 日韩大陆毛片av| 高潮无码精品色欲av午夜福利| 国产精品第四页| 亚洲成a人片在线www| 国产精品亚洲综合色区韩国| 日韩欧美国产二区| 国内精品视频| 97精品视频在线观看| 国产中文字幕在线看| 91精品国产麻豆| 亚洲欧美在线视频免费| 国产欧美一区二区三区在线老狼| 天天干天天色天天干| 国产精品黄色| 天堂√在线观看一区二区| 日本欧美不卡| 精品中文字幕在线2019| 亚洲 精品 综合 精品 自拍| 欧美亚洲国产怡红院影院| 免费无遮挡无码永久在线观看视频| 成人精品一区二区三区中文字幕| 激情网站五月天| 亚洲精品中文字幕乱码| 蜜桃久久影院| 欧美1区2区3| 国产精品激情av电影在线观看| 国产日产一区二区三区| 亚洲乱码一区二区| 国产美女精品视频国产| 一本大道综合伊人精品热热| 老妇女50岁三级| 久久久久久久久久久久久久久99| 波多野结衣国产精品| 99精品视频免费全部在线| 一区二区在线中文字幕电影视频| 国内露脸中年夫妇交换精品| 国产欧美精品日韩| 成人欧美magnet| 久久99久久久久久久噜噜| 高h视频在线| 亚洲精品456在线播放狼人| 91久久精品国产91性色69| 欧美日韩一区二区在线播放| 99视频只有精品| 日本一区二区动态图| 国产老熟女伦老熟妇露脸| 狠狠色综合日日| 午夜激情福利在线| 一区二区三区四区五区在线| 毛片在线视频观看| 亚洲精品久久久| 一区不卡视频| 精品免费av| 欧美色欧美亚洲另类七区| 看全色黄大色大片免费久久久| 91久久夜色精品国产网站| 都市激情亚洲综合| 午夜精品视频在线| 欧美aaaxxxx做受视频| 日韩在线视频国产| 99re在线视频| 一个色综合导航| 日本免费不卡| 精品视频久久久久久久| 高h放荡受浪受bl| 8v天堂国产在线一区二区| 中文字幕视频免费观看| 在线免费观看视频一区| 黄色av一级片| 色婷婷av一区二区三区软件| 国产精品久免费的黄网站| 亚洲一卡二卡三卡四卡五卡| 男人操女人的视频网站| 亚洲免费在线观看| 1024手机在线视频| 亚洲国产综合视频在线观看| 青青草精品在线视频| 夜夜嗨av一区二区三区四季av| 欧美国产在线看| 亚洲综合激情小说| 亚洲一区二区91| 午夜在线电影亚洲一区| 西西44rtwww国产精品| 日韩欧美999| 中国老头性行为xxxx| 欧美日韩精品一区二区三区四区| 97精品久久人人爽人人爽| 91精品国产aⅴ一区二区| 亚洲国产精品国自产拍久久| 欧美成人乱码一区二区三区| 性中国xxx极品hd| 亚洲成人aaa| 天堂√在线中文官网在线| 亚洲人成77777在线观看网| 国产永久av在线| 日韩天堂在线视频| 三级福利片在线观看| 午夜精品视频在线| 欧美特大特白屁股xxxx| 国产精品美女www| 国产高清精品二区| 国产亚洲精品美女久久久m| 综合亚洲自拍| 日本丰满大乳奶| 亚洲国产免费| 冲田杏梨av在线| 国产一区美女在线| 日本黄色录像片| 久久久美女艺术照精彩视频福利播放| youjizz亚洲女人| 一个色在线综合| 好吊色在线视频| 欧美一区二区三区视频| 视频福利在线| 久久视频在线播放| av中文在线资源库| 国产精品视频久久久| 麻豆视频久久| 免费成人av网站| 一区二区三区网站| 妺妺窝人体色www在线小说| 日本视频免费一区| 男人女人拔萝卜视频| 日本一区二区三区视频视频| 欧美精品xxxxx| 在线观看视频一区| 欧洲成人一区二区三区| 丝袜亚洲另类欧美重口| free性欧美| 91精品视频免费| 亚洲小说图片视频| 男人天堂新网址| 久久电影网电视剧免费观看| 欧美 变态 另类 人妖| 亚洲蜜臀av乱码久久精品蜜桃| 人妻 日韩精品 中文字幕| 日韩欧美中文字幕精品| 都市激情一区| 51精品在线观看| 日韩影片在线观看| 亚洲不卡1区| 樱桃成人精品视频在线播放| www.日本久久| 国产精品视频yy9299一区| 国产综合精品视频| 欧美tickling网站挠脚心| 九七电影韩国女主播在线观看| 国产91在线高潮白浆在线观看| 草莓视频一区二区三区| 9色视频在线观看| 久久成人麻豆午夜电影| 免费看黄色的视频| 精品久久久精品| 理论片中文字幕| 久久国产精品久久久| 日韩毛片免费看| 亚洲成人在线视频网站| 久久精品一区二区三区中文字幕| 国产情侣久久久久aⅴ免费| 亚洲欧美电影一区二区| 国产一区二区在线视频观看| 在线丨暗呦小u女国产精品| 偷拍精品精品一区二区三区| 久久综合精品一区| 国产亚洲精品bv在线观看| 亚洲精品激情视频| 亚洲香蕉伊在人在线观| www日本在线| 久久99视频免费| 亚洲日本视频在线| 人妻无码一区二区三区四区| 高清国产一区二区| 国产精品日日夜夜| 亚洲高清免费观看高清完整版| av影院在线免费观看| 精品国产乱码久久久久久久软件| 伊人成年综合电影网| 中文字幕一区二区三区乱码不卡| 亚洲自拍偷拍欧美| 五十路在线观看| 69久久夜色精品国产7777| 免费精品国产| 91人人澡人人爽人人精品| 《视频一区视频二区| 国产熟女精品视频| 久久久久久久香蕉网| 红杏aⅴ成人免费视频| 免费看一级大黄情大片| 久久久91精品国产一区二区精品 | 精品亚洲永久免费| 亚洲成人在线网| 男人最爱成人网| 亚洲高清乱码| 国产激情视频一区二区在线观看 | 亚洲国产97在线精品一区| 国产精品一二三产区| 欧美日韩高清免费| 久久国产人妖系列| 精品无码黑人又粗又大又长| 日韩久久午夜影院| 男女啪啪999亚洲精品| 91国在线高清视频| 99精品偷自拍| 中文字幕日韩国产| 欧美精品久久久久久久| 亚洲日产av中文字幕| 午夜免费看毛片| 亚洲国产精品久久久男人的天堂| 午夜国产在线观看| 成人春色激情网| 一本色道久久综合| 黄色免费一级视频| 精品欧美一区二区在线观看| 成人性生交大片免费观看网站| 一区高清视频| av中文字幕不卡| 一区二区www| 2019亚洲男人天堂| 99久久99久久精品国产片桃花| 白嫩情侣偷拍呻吟刺激 | 亚洲精品久久久久久动漫器材一区| 欧美在线一区二区视频| 久久精品久久久| 中文字幕丰满乱子伦无码专区| 欧美精品亚洲二区| 成人免费网站观看| 一区二区三区欧美在线| 成人黄色av电影| 91麻豆一区二区| 浅井舞香一区二区| 狠狠爱综合网| 91香蕉一区二区三区在线观看| 日韩精品在线视频美女|