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

相关文章

SpringBoot项目注入 traceId 追踪整个请求的日志链路(过程详解)

《SpringBoot项目注入traceId追踪整个请求的日志链路(过程详解)》本文介绍了如何在单体SpringBoot项目中通过手动实现过滤器或拦截器来注入traceId,以追踪整个请求的日志链... SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排

Spring Boot整合log4j2日志配置的详细教程

《SpringBoot整合log4j2日志配置的详细教程》:本文主要介绍SpringBoot项目中整合Log4j2日志框架的步骤和配置,包括常用日志框架的比较、配置参数介绍、Log4j2配置详解... 目录前言一、常用日志框架二、配置参数介绍1. 日志级别2. 输出形式3. 日志格式3.1 PatternL

开启mysql的binlog日志步骤详解

《开启mysql的binlog日志步骤详解》:本文主要介绍MySQL5.7版本中二进制日志(bin_log)的配置和使用,文中通过图文及代码介绍的非常详细,需要的朋友可以参考下... 目录1.查看是否开启bin_log2.数据库会把日志放进logs目录中3.查看log日志总结 mysql版本5.71.查看

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

SpringBoot如何使用TraceId日志链路追踪

《SpringBoot如何使用TraceId日志链路追踪》文章介绍了如何使用TraceId进行日志链路追踪,通过在日志中添加TraceId关键字,可以将同一次业务调用链上的日志串起来,本文通过实例代码... 目录项目场景:实现步骤1、pom.XML 依赖2、整合logback,打印日志,logback-sp

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

我在移动打工的日志

客户:给我搞一下录音 我:不会。不在服务范围。 客户:是不想吧 我:笑嘻嘻(气笑) 客户:小姑娘明明会,却欺负老人 我:笑嘻嘻 客户:那我交话费 我:手机号 客户:给我搞录音 我:不会。不懂。没搞过。 客户:那我交话费 我:手机号。这是电信的啊!!我这是中国移动!! 客户:我不管,我要充话费,充话费是你们的 我:可是这是移动!!中国移动!! 客户:我这是手机号 我:那又如何,这是移动!你是电信!!

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录 在深度学习项目中,目标检测是一项重要的任务。本文将详细介绍如何使用Detectron2进行目标检测模型的复现训练,涵盖训练数据准备、训练命令、训练日志分析、训练指标以及训练输出目录的各个文件及其作用。特别地,我们将演示在训练过程中出现中断后,如何使用 resume 功能继续训练,并将我们复现的模型与Model Zoo中的

SSM项目使用AOP技术进行日志记录

本步骤只记录完成切面所需的必要代码 本人开发中遇到的问题: 切面一直切不进去,最后发现需要在springMVC的核心配置文件中中开启注解驱动才可以,只在spring的核心配置文件中开启是不会在web项目中生效的。 之后按照下面的代码进行配置,然后前端在访问controller层中的路径时即可观察到日志已经被正常记录到数据库,代码中有部分注释,看不懂的可以参照注释。接下来进入正题 1、导入m

多数据源的事务处理总是打印很多无用的log日志

之前做了一个项目,需要用到多数据源以及事务处理,在使用事务处理,服务器总是打印很多关于事务处理的log日志(com.atomikos.logging.Slf4jLogger),但是我们根本不会用到这些log日志,反而使得查询一些有用的log日志变得困难。那要如何屏蔽这些log日志呢? 之前的项目是提高项目打印log日志的级别,后来觉得这样治标不治本。 现在有一个更好的方法: 我使用的是log