成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SpringBoot與Logback整合,實現敏感信息日志脫敏并且異步高效寫入?功能

開發 前端
?Logback 是一個強大且靈活的日志框架,適用于各種規模的應用程序。通過自定義 Appender,可以實現復雜的日志處理邏輯,如敏感信息脫敏和異步寫入,從而提升系統的安全性和性能。

Logback 是一個強大且靈活的日志框架,適用于各種規模的應用程序。通過自定義 Appender,可以實現復雜的日志處理邏輯,如敏感信息脫敏和異步寫入,從而提升系統的安全性和性能。

工作流程

圖片圖片

為什么需要自定義 Appender?

在某些情況下,默認的 Appender 無法滿足特定需求,例如:

  • 自動脫敏敏感信息。
  • 異步處理日志以提高性能。
  • 將日志發送到外部系統或服務。

代碼實操

<!-- Disruptor -->
    <dependency>
        <groupId>com.lmax</groupId>
        <artifactId>disruptor</artifactId>
        <version>3.4.4</version>
    </dependency>

    <!-- Logback Classic -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
    </dependency>

創建自定義Appender

創建一個名為SensitiveDataMaskingAppender的類,該類繼承自AppenderBase<ILoggingEvent>,并在其中使用Disruptor隊列進行異步處理。

package com.example.demo.logging;

import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;
import com.lmax.disruptor.*;
import com.lmax.disruptor.dsl.Disruptor;
import org.slf4j.MDC;

import java.util.concurrent.Executors;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

publicclass SensitiveDataMaskingAppender extends AppenderBase<ILoggingEvent> {

    // 正則表達式模式用于匹配身份證號碼
    privatestaticfinal Pattern ID_CARD_PATTERN = Pattern.compile("\\d{15}(\\d{2}[A-Za-z])?");
    // 正則表達式模式用于匹配手機號碼
    privatestaticfinal Pattern PHONE_NUMBER_PATTERN = Pattern.compile("(\\+86)?(1[3-9]\\d{9})");

    private RingBuffer<Event> ringBuffer;

    @Override
    public void start() {
        super.start();

        // 創建事件工廠
        EventFactory<Event> factory = Event::new;
        // 設置環形緩沖區大小,必須是2的冪
        int bufferSize = 1024;
        // 使用緩存線程池
        Executor executor = Executors.newCachedThreadPool();
        // 創建Disruptor實例
        Disruptor<Event> disruptor = new Disruptor<>(factory, bufferSize, executor,
                ProducerType.MULTI, new BusySpinWaitStrategy());
        // 設置事件處理器
        disruptor.handleEventsWith(new EventHandler<Event>() {
            @Override
            public void onEvent(Event event, long sequence, boolean endOfBatch) throws Exception {
                // 脫敏日志消息
                String logMessage = maskSensitiveData(event.getLogMessage());
                // 打印脫敏后的日志消息到控制臺
                System.out.println(logMessage);
            }
        });
        // 獲取RingBuffer
        ringBuffer = disruptor.getRingBuffer();
        // 啟動Disruptor
        disruptor.start();
    }

    @Override
    protected void append(ILoggingEvent eventObject) {
        // 獲取下一個序列號
        long sequence = ringBuffer.next(); 
        try {
            // 根據序列號獲取事件對象
            Event event = ringBuffer.get(sequence); 
            // 設置日志消息
            event.setLogMessage(eventObject.getMessage()); 
        } finally {
            // 發布事件
            ringBuffer.publish(sequence);
        }
    }

    /**
     * 脫敏日志消息中的敏感信息
     * @param message 日志消息
     * @return 脫敏后的日志消息
     */
    private String maskSensitiveData(String message) {
        Matcher idCardMatcher = ID_CARD_PATTERN.matcher(message);
        while (idCardMatcher.find()) {
            // 替換身份證號碼中間部分為星號
            String maskedIdCard = idCardMatcher.group().substring(0, 6) + "********" + idCardMatcher.group().substring(14);
            message = message.replace(idCardMatcher.group(), maskedIdCard);
        }

        Matcher phoneNumberMatcher = PHONE_NUMBER_PATTERN.matcher(message);
        while (phoneNumberMatcher.find()) {
            // 替換手機號碼中間部分為星號
            String maskedPhoneNumber = phoneNumberMatcher.group().substring(0, 3) + "****" + phoneNumberMatcher.group().substring(7);
            message = message.replace(phoneNumberMatcher.group(), maskedPhoneNumber);
        }

        return message;
    }

    // 定義事件類
    privatestaticclass Event {
        private String logMessage;

        public String getLogMessage() {
            return logMessage;
        }

        public void setLogMessage(String logMessage) {
            this.logMessage = logMessage;
        }
    }
}

配置Logback使用自定義Appender

在src/main/resources/logback-spring.xml文件中配置自定義appender:

<configuration>
    <!-- 自定義Appender配置 -->
    <appender name="SENSITIVE_MASKING_APPENDER" class="com.example.demo.logging.SensitiveDataMaskingAppender">
    </appender>

    <!-- 根Logger配置 -->
    <root level="info">
        <appender-ref ref="SENSITIVE_MASKING_APPENDER"/>
    </root>
</configuration>

創建Controller、Service和Repository層

Controller層

創建一個簡單的控制器來測試日志記錄功能。

package com.example.demo.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
publicclass UserController {

    // 獲取日志記錄器
    privatestaticfinal Logger logger = LoggerFactory.getLogger(UserController.class);

    /**
     * 處理/user請求,記錄用戶信息并返回響應
     * @param idCard 用戶身份證號碼
     * @param phoneNumber 用戶手機號碼
     * @return 響應字符串
     */
    @GetMapping("/user")
    public String getUserInfo(@RequestParam String idCard, @RequestParam String phoneNumber) {
        // 記錄用戶信息到日志
        logger.info("User Info - ID Card: {}, Phone Number: {}", idCard, phoneNumber);
        return"User info logged";
    }
}

啟動類

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

測試

curl "http://localhost:8080/user?idCard=123456123456123456&phnotallow=13800138000"

控制臺日志

User Info - ID Card: 123456********56, Phone Number: 138****8000
責任編輯:武曉燕 來源: Java知識日歷
相關推薦

2025-03-11 08:34:22

2024-09-05 08:58:37

2023-10-09 07:37:01

2023-10-27 08:46:34

DFA算法工具

2025-02-14 09:07:35

2024-12-24 08:44:55

ActiveMQRabbitMQ交換機

2025-05-20 09:00:04

SpringGeoHash派單

2025-05-16 08:55:58

2023-06-06 08:51:06

2025-03-20 08:57:54

Spring日志存儲系統

2025-03-26 08:43:17

2025-03-19 08:36:55

2025-05-23 08:37:26

2025-04-23 08:50:00

SpringBootCurator分布式鎖

2021-10-28 07:56:52

多線程日志系統嵌入式開發

2025-05-09 08:34:57

RSocketSpringBoot聊天系統

2025-03-31 08:43:34

SpringTika優化

2025-05-06 08:40:21

SpringPostGIS系統

2025-03-03 07:30:00

SpringBootJGraphT網絡建模

2025-06-17 08:39:43

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品免费视频一区 | 香蕉国产在线视频 | 国产成人免费视频网站视频社区 | 精品影院 | 日韩欧美三级电影在线观看 | 久久草在线视频 | 亚洲aⅴ | 福利视频三区 | 午夜视频大全 | 亚洲日日夜夜 | 久久久久国产一区二区三区 | 国产激情在线观看视频 | 天天夜天天操 | 夜夜精品浪潮av一区二区三区 | 国产三级一区二区三区 | 91在线网| 日韩精品一区二区三区视频播放 | 国产日产精品一区二区三区四区 | 日韩在线精品 | 爱爱视频在线观看 | 国产精品视频一区二区三区不卡 | 日日操夜夜干 | 欧美成人在线影院 | av一区在线观看 | 久久精品国产一区二区电影 | www.婷婷亚洲基地 | 亚洲综合区 | 日韩av一区二区在线观看 | 国产人成精品一区二区三 | 一级黄色片日本 | 久久久久国产一区二区 | 午夜国产 | 91av视频 | 久久精品亚洲一区 | 羞羞视频免费观看 | 国产999精品久久久久久绿帽 | 521av网站| 色精品视频 | 国产一区免费视频 | 久久国产精99精产国高潮 | 黄色大片免费看 |