lockback日志脱敏

项目中打印到控台的敏感信息,需要做脱敏出来

记录下来,防止遗忘

一、重写MessageConverter


import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import ch.qos.logback.classic.pattern.MessageConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;

import com.xxx.xxx.util.utils.SensitiveInfoUtils;

public class SensitiveDataConverter extends MessageConverter {

	/**
	 * 日志脱敏开关
	 */
	private static String converterCanRun = "true";

	/**
	 * 日志脱敏关键字
	 */
	// 身份证号码脱敏
	private static String[] idNoKeys = new String[] {
			"idNo", "contactIdNo", "accountIdNo"
	};

	// 中文名
	private static String[] nameKeys = new String[] {
	// "name"
	};

	// 银行卡号码脱敏
	private static String[] bankCardKeys = new String[] {
			"bankActId", "cardNo", "cardNum"
	};

	// 手机号码脱敏
	private static String[] mobileKeys = new String[] {
			"mobile", "contactTelno"
	};

	@Override
	public String convert(ILoggingEvent event) {
		// 获取原始日志
		String oriLogMsg = event.getFormattedMessage();
		// 获取脱敏后的日志
		String afterLogMsg = invokeMsg(oriLogMsg);
		return afterLogMsg;
	}

	/**
	 * 处理日志字符串,返回脱敏后的字符串
	 * 
	 * @param msg
	 * @return
	 */
	public String invokeMsg(final String oriMsg) {
		String tempMsg = oriMsg;
		if ("true".equals(converterCanRun)) {
			String[] keysArray = this.concatAll(idNoKeys, nameKeys, bankCardKeys, mobileKeys);
			for (String key : keysArray) {
				int index = -1;
				do {
					index = tempMsg.indexOf(key, index + 1);
					if (index != -1) {
						// 判断key是否为单词字符
						if (isWordChar(tempMsg, key, index)) {
							continue;
						}
						// 寻找值的开始位置
						int valueStart = getValueStartIndex(tempMsg, index + key.length());

						// 查找值的结束位置(逗号,分号)
						int valueEnd = getValuEndEIndex(tempMsg, valueStart);

						// 对获取的值进行脱敏
						String subStr = tempMsg.substring(valueStart, valueEnd);
						subStr = tuomin(subStr, key);
						tempMsg = tempMsg.substring(0, valueStart) + subStr + tempMsg.substring(valueEnd);
					}
				} while (index != -1);
			}
		}
		return tempMsg;
	}

	private <T> T[] concatAll(T[] first, T[]... rest) {
		int totalLength = first.length;
		for (T[] array : rest) {
			totalLength += array.length;
		}
		T[] result = Arrays.copyOf(first, totalLength);
		int offset = first.length;
		for (T[] array : rest) {
			System.arraycopy(array, 0, result, offset, array.length);
			offset += array.length;
		}
		return result;
	}

	private static Pattern pattern = Pattern.compile("[0-9a-zA-Z]");

	/**
	 * 判断从字符串msg获取的key值是否为单词 , index为key在msg中的索引值
	 * 
	 * @return
	 */
	private boolean isWordChar(String msg, String key, int index) {

		// 必须确定key是一个单词............................
		if (index != 0) { // 判断key前面一个字符
			char preCh = msg.charAt(index - 1);
			Matcher match = pattern.matcher(preCh + "");
			if (match.matches()) {
				return true;
			}
		}
		// 判断key后面一个字符
		char nextCh = msg.charAt(index + key.length());
		Matcher match = pattern.matcher(nextCh + "");
		if (match.matches()) {
			return true;
		}
		return false;
	}

	/**
	 * 获取value值的开始位置
	 * 
	 * @param msg 要查找的字符串
	 * @param valueStart 查找的开始位置
	 * @return
	 */
	private int getValueStartIndex(String msg, int valueStart) {
		// 寻找值的开始位置.....................
### Logback 依赖介绍及用途 #### logback-core `logback-core` 是整个 Logback 日志系统的基石,提供了通用的日志记录功能。这个模块包含了所有其他模块所必需的基础类和接口,使得 `logback-classic` 和 `logback-access` 能够构建在其之上并扩展其能力[^1]。 ```xml <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.2.3</version> </dependency> ``` #### logback-classic 此模块不仅实现了 SLF4J (Simple Logging Facade for Java) 的 API ,还保持了与 log4j API 的兼容性。通过这种方式,开发者可以轻松切换不同的日志实现而不必修改应用程序中的代码逻辑。此外,它也支持更高级别的特性如 MDC(Mapped Diagnostic Contexts),用于在同一进程中区分不同上下文环境下的日志输出[^2]。 ```xml <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> ``` #### logback-access 专门针对 HTTP 请求设计的日志解决方案——`logback-access` 可集成到 Servlet 容器中去收集关于 Web 应用程序请求的信息。这允许管理员监控服务器性能指标以及分析用户行为模式等重要数据。 ```xml <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-access</artifactId> <version>1.2.3</version> </dependency> ``` 每个模块都有特定的角色来满足不同类型的应用需求,而它们共同构成了一个强大灵活的日志管理工具集。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值