精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

69久久夜色精品国产69蝌蚪网| 久久久久国色av免费看影院| 欧美日韩国产成人高清视频| 国产精品果冻传媒| 草草视频在线| 久久综合色天天久久综合图片| 国产精品久久激情| 欧美日韩在线观看免费| 欧美日韩看看2015永久免费| 欧美性色欧美a在线播放| 黄色一级片网址| 香蕉视频网站在线| 黄色资源网久久资源365| 性欧美视频videos6一9| 林心如三级全黄裸体| 伊人久久大香线蕉av超碰| 欧美性猛交99久久久久99按摩| 亚洲欧美日韩国产成人综合一二三区 | 福利在线一区| 欧美系列在线观看| 国产91沈先生在线播放| 国产视频第一页在线观看| 国产精品一级在线| 国产精品流白浆视频| 五月天婷婷网站| 久久精品影视| 国产一区二区三区欧美| 在线免费看黄色片| 成人在线精品| 欧美在线综合视频| 日日碰狠狠添天天爽超碰97| а√天堂8资源在线官网| 久久一区二区三区国产精品| 国产精品久久久久久久久婷婷| 在线免费a视频| 久久久精品午夜少妇| 欧美极品在线视频| 国产午夜手机精彩视频| 久久国产精品成人免费观看的软件| 亚洲国产精品va在线看黑人动漫| 午夜激情影院在线观看| 欧美一级网址| 91国在线观看| 黄www在线观看| 蜜桃成人365av| 一级精品视频在线观看宜春院| 杨幂一区欧美专区| porn亚洲| 中文字幕精品一区二区三区精品| 欧美视频小说| 青青草免费在线| 91在线播放网址| 国产精品一级久久久| 成 人 免费 黄 色| 国产精品1区2区3区在线观看| 成人精品久久一区二区三区| 一区二区国产欧美| 精品一区二区三区免费播放 | 亚洲三区在线| av在线电影观看| 国产午夜久久久久| 青青草成人网| 国产最新视频在线| 久久久久久久免费视频了| 精品一区二区三区视频日产| 色婷婷中文字幕| 99re6这里只有精品视频在线观看| 精品国产日本| 深夜福利免费在线观看| 26uuu亚洲婷婷狠狠天堂| 免费精品视频一区| 免费黄色在线视频网站| 中文子幕无线码一区tr| 亚洲美女网站18| 国产激情视频在线| 亚洲国产精品精华液网站| 日韩国产一级片| 色黄视频在线观看| 在线视频欧美区| 男人午夜视频在线观看| 亚洲电影一区| 日韩精品免费一线在线观看| 97在线观看免费视频| 久久激情电影| 欧美激情区在线播放| 男人的天堂一区二区| 老司机精品导航| 国产在线观看不卡| 亚洲黄色精品视频| 久久综合一区二区| 午夜啪啪免费视频| 成人免费图片免费观看| 在线免费av一区| 欧美体内she精高潮| 精品少妇3p| 最近2019中文字幕mv免费看 | 中文字幕乱码亚洲无线精品一区 | 欧洲在线视频一区| 国产原创视频在线观看| 五月天丁香久久| 国产视频手机在线播放| 亚洲日本va| 亚洲色图色老头| 黑人操日本美女| 99在线|亚洲一区二区| 国产精品热视频| 亚洲AV无码精品国产| 国产午夜精品久久久久久免费视| 天天干天天操天天干天天操| 久久久男人天堂| 欧美美女一区二区| 熟女少妇一区二区三区| 欧美在线亚洲综合一区| 国产精品wwwwww| 手机看片国产1024| 中文字幕一区二区三区在线观看| 久久亚洲中文字幕无码| 色综合.com| 亚洲欧洲偷拍精品| 久久婷婷国产麻豆91| 奇米一区二区三区| 久久66热这里只有精品| 成人短视频在线| 在线视频亚洲一区| 激情综合丁香五月| 欧美午夜一区二区福利视频| 国产美女精品视频免费观看| 四虎在线免费观看| 亚洲成av人片| 中文字幕无人区二| 欧美gvvideo网站| 国产精品福利在线| 免费在线性爱视频| 激情成人中文字幕| www.美色吧.com| 综合久久久久| 成人性生交xxxxx网站| av片在线免费观看| 91福利视频网站| 男女黄床上色视频| 99国产精品| 国产精品一区二区三区不卡 | 欧美一级一区二区三区| 亚洲女女做受ⅹxx高潮| 亚洲激情在线看| 婷婷精品进入| 国产自摸综合网| 日本蜜桃在线观看| 欧美日韩高清一区二区不卡 | 一区二区三区在线视频观看 | 日韩亚洲第一页| 青娱乐在线免费视频| 久久先锋影音av鲁色资源| 免费国产a级片| 日韩激情网站| 欧美中文字幕视频在线观看| 亚洲 美腿 欧美 偷拍| 亚洲va韩国va欧美va| yjizz视频| 亚洲精品护士| 欧美高清性xxxxhd| 香蕉视频亚洲一级| 一区二区三区天堂av| 中国黄色一级视频| 亚洲色图在线播放| 俄罗斯女人裸体性做爰| 国产一区美女| 久久视频在线观看中文字幕| 色8久久影院午夜场| 一本色道久久综合亚洲精品小说| 中文字幕视频一区二区| 综合久久综合久久| 亚洲熟妇一区二区| 国产农村妇女毛片精品久久莱园子| 蜜桃视频在线观看成人| 日本精品另类| 欧美成人激情图片网| 亚洲黄色小说网址| 色狠狠综合天天综合综合| аⅴ天堂中文在线网| 国内精品久久久久影院一蜜桃| 日韩一级特黄毛片| 日韩最新在线| 国产日韩av在线播放| 菠萝蜜视频国产在线播放| 亚洲成人av在线播放| 国产成人无码专区| 亚洲欧美日韩一区二区 | 久久a级毛片毛片免费观看| 欧美亚洲日本网站| 在线视频婷婷| 亚洲精品在线电影| 99re热视频| 亚洲韩国精品一区| 极品蜜桃臀肥臀-x88av| 国产经典欧美精品| 黄色高清无遮挡| 久久久久久影院| 久久偷看各类wc女厕嘘嘘偷窃| h1515四虎成人| 久久久视频在线| 97电影在线| 日韩av一区二区在线| 亚洲影视一区二区| 精品久久久久国产| 免费中文字幕日韩| 久久久精品国产99久久精品芒果| 欧美性猛交久久久乱大交小说| 久久久免费视频网站| 少妇精品久久久一区二区| 91精品视频专区| 老色鬼在线视频| 久久九九有精品国产23| 天堂av电影在线观看| 91精品国产91久久久久久一区二区| 国产欧美日韩另类| 成人欧美一区二区三区1314| 亚洲欧美日本一区| 国产一区在线精品| 精品免费国产一区二区| 狠狠爱www人成狠狠爱综合网 | 免费国产a级片| 91九色精品国产一区二区| 久久66热这里只有精品| 亚洲1区在线| 成人亲热视频网站| 先锋欧美三级| 欧美在线视频免费| 任你弄在线视频免费观看| 中文字幕亚洲一区二区三区| 涩涩视频在线观看免费| 日韩欧美国产系列| 国产又黄又粗又长| 欧美色国产精品| 五月天激情国产综合婷婷婷| 亚洲国产精品久久人人爱| 国产精品三区在线观看| 国产精品免费视频一区| 日韩女同一区二区三区| 久久午夜羞羞影院免费观看| 国产精品无码在线| 成+人+亚洲+综合天堂| 无码国产精品一区二区高潮| 久久成人羞羞网站| 国产主播中文字幕| 日韩成人免费看| av片中文字幕| 亚洲一区不卡| 久久久久狠狠高潮亚洲精品| 午夜在线视频一区二区区别| 男人日女人下面视频| 夜夜嗨网站十八久久| 国产69精品久久久久999小说| 精品成人免费| 97视频久久久| 一区二区久久| 2022亚洲天堂| 久久裸体视频| 亚洲视频在线a| 日本大胆欧美人术艺术动态| 91香蕉视频导航| 久久99久久久欧美国产| 狠狠干狠狠操视频| 国产精品一级二级三级| 日本少妇一级片| 不卡大黄网站免费看| 免费a v网站| 久久久国产综合精品女国产盗摄| 波多野在线播放| 国产精品久久久久一区二区三区 | av中字幕久久| 色综合久久av| 久久久久久久久久久妇女| 欧美一级爱爱视频| 99av国产精品欲麻豆| 精品视频无码一区二区三区| 蜜臀国产一区二区三区在线播放| 亚洲视频一二三四| 成人网在线播放| 91成年人网站| 亚洲欧洲精品天堂一级 | 女人色偷偷aa久久天堂| 国产高清www| 视频精品一区二区| 91丝袜超薄交口足| 99久久精品费精品国产一区二区| 亚洲综合网在线观看| 国产精品久久久久久久第一福利 | 色综合久久中文字幕综合网| 日本妇乱大交xxxxx| 欧美一级黄色大片| 青青青免费视频在线2| www.99久久热国产日韩欧美.com| 污视频网站免费在线观看| 91高潮在线观看| 亚洲黑人在线| 国产精品一码二码三码在线| 欧美日韩性在线观看| 97中文字幕在线| 天堂久久久久va久久久久| 中文字幕第66页| 久久先锋影音av鲁色资源| 亚洲国产精品免费在线观看| 一本到不卡免费一区二区| av资源免费看| 伊人久久男人天堂| 大桥未久在线播放| 国产精品嫩草影院一区二区| 国产精品99久久免费观看| 亚洲伊人婷婷| 性8sex亚洲区入口| 中文字幕55页| 亚洲国产精品v| 激情五月色婷婷| 欧美大肚乱孕交hd孕妇| 波多野结衣在线影院| 国产91成人在在线播放| 国产一区2区在线观看| 欧洲在线视频一区| 99成人精品| 又黄又色的网站| 亚洲天堂成人在线观看| 少妇久久久久久久| 亚洲第一区在线| 成人免费网址| 成人国产精品色哟哟| 加勒比久久综合| 久久久久久久久久久视频| 国产成人免费视频一区| jizz中文字幕| 欧美日韩精品二区| 欧美在线 | 亚洲| 欧美精品一区二区三区国产精品 | 欧美日本在线播放| 欧美捆绑视频| 91精品国产99| 久久精品亚洲成在人线av网址| 神马午夜伦理影院| 精品一区二区三区日韩| 自拍偷拍你懂的| 在线亚洲一区二区| 蜜桃视频在线观看视频| 欧美最猛黑人xxxx黑人猛叫黄| 极品国产人妖chinesets亚洲人妖 激情亚洲另类图片区小说区 | 国产一区二区三区在线观看| 亚洲最新中文字幕| 深夜成人福利| 欧美亚洲一级二级| 香蕉久久国产| 日本激情小视频| 色婷婷综合在线| 免费福利在线观看| 国产福利精品视频| sdde在线播放一区二区| wwww.国产| 国产精品久久综合| 国产精品福利电影| 久久影视免费观看 | 国产情侣一区| 右手影院亚洲欧美| 欧美性猛交xxxx久久久| 美女欧美视频在线观看免费 | 青青草免费观看视频| 国产视频欧美视频| 午夜无码国产理论在线| 午夜精品一区二区在线观看| 精品一区二区三区在线观看| 91在线播放观看| 精品动漫一区二区三区在线观看| 大菠萝精品导航| 日本一区视频在线| 日韩国产欧美在线观看| 最新黄色av网址| 欧美一卡2卡3卡4卡| 成人黄色动漫| 色999五月色| 国产一区二区精品在线观看| 免费中文字幕在线观看| 日韩电影第一页| 国产黄色一区| www.18av.com| 久久免费看少妇高潮| 一本久道久久综合无码中文| 精品综合久久久久久97| 欧美日韩导航| mm131国产精品| 亚洲成人免费在线观看| 成a人片在线观看www视频| 97视频资源在线观看| 久久婷婷av| 精品国产精品国产精品| 亚洲精品91美女久久久久久久| av在线日韩| 成年人看的毛片| 国产精品久久久久久久久免费桃花 | av中文字幕在线| 粉嫩高清一区二区三区精品视频 | 欧美日韩精品在线一区| 超级砰砰砰97免费观看最新一期| 午夜激情一区二区三区|