logback 日志脱敏

2024-05-10 08:44
文章标签 日志 logback 脱敏

本文主要是介绍logback 日志脱敏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

工具类

CustomLogbackPatternLayoutEncoder.java


import ch.qos.logback.classic.encoder.PatternLayoutEncoder;public class CustomLogbackPatternLayoutEncoder extends PatternLayoutEncoder {/*** 正则替换规则*/private LogbackReplaces replaces;/*** 使用自定义 MyLogbackPatternLayout 格式化输出*/@Overridepublic void start() {CustomPatternLayout patternLayout = new CustomPatternLayout(replaces);patternLayout.setContext(context);patternLayout.setPattern(this.getPattern());patternLayout.setOutputPatternAsHeader(outputPatternAsHeader);patternLayout.start();this.layout = patternLayout;started = true;}public LogbackReplaces getReplaces() {return replaces;}public void setReplaces(LogbackReplaces replaces) {this.replaces = replaces;}
}

CustomPatternLayout.java


import ch.qos.logback.classic.PatternLayout;
import ch.qos.logback.classic.spi.ILoggingEvent;
import lombok.extern.slf4j.Slf4j;@Slf4j
public class CustomPatternLayout extends PatternLayout {/*** 正则替换规则*/private final LogbackReplaces replaces;public CustomPatternLayout(LogbackReplaces replaces) {super();this.replaces = replaces;}/*** 格式化日志信息** @param event ILoggingEvent* @return 日志信息*/@Overridepublic String doLayout(ILoggingEvent event) {// 占位符填充String msg = super.doLayout(event);// 脱敏处理return this.buildSensitiveMsg(msg);}/*** 根据配置对日志进行脱敏** @param msg 消息* @return 脱敏后的日志信息*/public String buildSensitiveMsg(String msg) {if (this.replaces == null || this.replaces.getReplace() == null || this.replaces.getReplace().isEmpty()) {log.error("日志脱敏开启,但未配置脱敏规则,请检查配置后重试");return msg;}String sensitiveMsg = msg;for (RegexReplacement replace : this.replaces.getReplace()) {// 遍历脱敏正则 & 替换敏感数据sensitiveMsg = replace.format(sensitiveMsg);}return sensitiveMsg;}
}

RegexReplacement.java


import java.util.regex.Pattern;public class RegexReplacement {/*** 脱敏匹配正则*/private Pattern regex;/*** 替换正则*/private String replacement;/*** Perform the replacement.** @param msg The String to match against.* @return the replacement String.*/public String format(final String msg) {return regex.matcher(msg).replaceAll(replacement);}public Pattern getRegex() {return regex;}public void setRegex(String regex) {this.regex = Pattern.compile(regex);}public String getReplacement() {return replacement;}public void setReplacement(String replacement) {this.replacement = replacement;}
}

LogbackReplaces.java


import java.util.ArrayList;
import java.util.List;public class LogbackReplaces {/*** 脱敏正则列表*/private List<RegexReplacement> replace = new ArrayList<>();/*** 添加规则(因为replace类型是list,必须指定addReplace方法用以添加多个)** @param replacement replacement*/public void addReplace(RegexReplacement replacement) {replace.add(replacement);}public List<RegexReplacement> getReplace() {return replace;}public void setReplace(List<RegexReplacement> replace) {this.replace = replace;}
}

配置文件logback.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="6000"><!--输出到控制台--><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder class="CustomLogbackPatternLayoutEncoder类路径"><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t][%p][%c][%M][%L]-> [%m]%n</Pattern><!-- 脱敏规则列表 --><replaces><!-- 脱敏规则 --><replace><!-- 邮箱,保留@前的前1后1 --><regex><![CDATA[(\w+)([-+.]\w+)@(\w+([-.]\w+)).(\w+([-.]\w+)*)]]></regex><replacement>$1****@$3.$4</replacement></replace><replace><!-- 11位的手机号:保留前3后4 --><regex><![CDATA[(1)([3-9])(\d)(\d{4})(\d{4})]]></regex><replacement>$1$2$3****$5</replacement></replace><replace><!-- 固定电话: XXXX-XXXXXXXX或XXX-XXXXXXXX,保留区号+前2后2 --><regex><![CDATA[([\d]{3,4}-)(\d{2})(\d{4})(\d{2})]]></regex><replacement>$1$2****$4</replacement></replace><replace><!-- security自带测试密码--><regex><![CDATA[.*(Using generated security).*]]></regex><replacement></replacement></replace><replace><!--ip --><regex><![CDATA[(?<![0-9])(?:(?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.){3}(?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])(?![0-9])]]></regex><replacement>***</replacement></replace></replaces></encoder></appender><!-- 按照每天生成日志文件 --><appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><FileNamePattern>${user.home}/logs/admin/app.%d{yyyy-MM-dd}-%i.log</FileNamePattern><MaxHistory>15</MaxHistory><!--日志文件最大的大小--><MaxFileSize>100MB</MaxFileSize><totalSizeCap>5GB</totalSizeCap></rollingPolicy><encoder class="CustomLogbackPatternLayoutEncoder类路径"><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern><replaces><replace><!-- 邮箱,保留@前的前1后1 --><regex><![CDATA[(\w+)([-+.]\w+)@(\w+([-.]\w+)).(\w+([-.]\w+)*)]]></regex><replacement>$1****@$3.$4</replacement></replace><replace><!-- 11位的手机号:保留前3后4 --><regex><![CDATA[(1)([3-9])(\d)(\d{4})(\d{4})]]></regex><replacement>$1$2$3****$5</replacement></replace><replace><!-- 固定电话: XXXX-XXXXXXXX或XXX-XXXXXXXX,保留区号+前2后2 --><regex><![CDATA[([\d]{3,4}-)(\d{2})(\d{4})(\d{2})]]></regex><replacement>$1$2****$4</replacement></replace><replace><!-- security自带测试密码--><regex><![CDATA[.*(Using generated security).*]]></regex><replacement></replacement></replace><replace><!--ip --><regex><![CDATA[(?<![0-9])(?:(?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.){3}(?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])(?![0-9])]]></regex><replacement>***</replacement></replace></replaces></encoder></appender><!--log4jdbc --><logger name="org.apache.ibatis" level="debug"/><logger name="java.sql" level="debug"/><root level="info"><appender-ref ref="console"/><appender-ref ref="file"/></root></configuration>

这篇关于logback 日志脱敏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/975974

相关文章

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

golang 日志log与logrus示例详解

《golang日志log与logrus示例详解》log是Go语言标准库中一个简单的日志库,本文给大家介绍golang日志log与logrus示例详解,感兴趣的朋友一起看看吧... 目录一、Go 标准库 log 详解1. 功能特点2. 常用函数3. 示例代码4. 优势和局限二、第三方库 logrus 详解1.

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

SpringBoot项目使用MDC给日志增加唯一标识的实现步骤

《SpringBoot项目使用MDC给日志增加唯一标识的实现步骤》本文介绍了如何在SpringBoot项目中使用MDC(MappedDiagnosticContext)为日志增加唯一标识,以便于日... 目录【Java】SpringBoot项目使用MDC给日志增加唯一标识,方便日志追踪1.日志效果2.实现步

SQL Server清除日志文件ERRORLOG和删除tempdb.mdf

《SQLServer清除日志文件ERRORLOG和删除tempdb.mdf》数据库再使用一段时间后,日志文件会增大,特别是在磁盘容量不足的情况下,更是需要缩减,以下为缩减方法:如果可以停止SQLSe... 目录缩减 ERRORLOG 文件(停止服务后)停止 SQL Server 服务:找到错误日志文件:删除

grom设置全局日志实现执行并打印sql语句

《grom设置全局日志实现执行并打印sql语句》本文主要介绍了grom设置全局日志实现执行并打印sql语句,包括设置日志级别、实现自定义Logger接口以及如何使用GORM的默认logger,通过这些... 目录gorm中的自定义日志gorm中日志的其他操作日志级别Debug自定义 Loggergorm中的