当前位置: 首页 > news >正文

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 日志脱敏

工具类 CustomLogbackPatternLayoutEncoder.java import ch.qos.logback.classic.encoder.PatternLayoutEncoder;public class CustomLogbackPatternLayoutEncoder extends PatternLayoutEncoder {/*** 正则替换规则*/private LogbackReplaces replaces;/*** 使用自定义 MyLog…...

element-ui的表单中,输入框、级联选择器的长度设置

使用<el-col>控制输入框的长度 <el-form-item label"姓名" label-width"80px"><el-col :span"15"><el-input v-model"form.name" autocomplete"off"></el-input></el-col></el-form…...

深入了解 npm:Node.js 包管理工具详解

文章目录 一、npm 基本概念1.1 什么是 npm&#xff1f;1.2 package.json 文件 二、npm 常用命令2.1 初始化项目2.2 安装依赖2.2.1 安装单个包2.2.2 全局安装包2.2.3 安装开发依赖 2.3 移除依赖2.4 更新依赖2.5 查看已安装的包2.6 发布包 三、npm 高级用法3.1 使用 npm scripts3…...

记一次跨域问题

线上跨域问题&#xff0c;在自己配置确认没问题下&#xff0c;要及时找运维看看是不是nginx配置问题。 两个方面&#xff1a; 项目代码 nginx配置 SpringBoot 解决跨域问题的 5 种方案&#xff01; SpringBoot解决CORS跨域问题 SpringBoot-实现CORS跨域原理及解决方案...

第9章 负载均衡集群日常维护

一个设计良好的高可用负载均衡集群&#xff0c;交付使用以后并不能一劳永逸。欲使其高效、稳定、持续对外服务&#xff0c;日常维护必不可少。 对于高可用负载均衡集群来说&#xff0c;有两种类型的维护形式&#xff1a;常规性维护与突发性维护。突发性维护一般指故障处理&…...

鸿蒙内核源码分析(消息封装篇) | 剖析LiteIpc(上)进程通讯内容

基本概念 LiteIPC是OpenHarmony LiteOS-A内核提供的一种新型IPC&#xff08;Inter-Process Communication&#xff0c;即进程间通信&#xff09;机制&#xff0c;为轻量级进程间通信组件&#xff0c;为面向服务的系统服务框架提供进程间通信能力&#xff0c;分为内核实现和用户…...

Charger之三动态电源路径管理(DPPM)

-----本文简介----- 主要内容包括&#xff1a; 领资料&#xff1a;点下方↓名片关注回复&#xff1a;粉丝群 硬件之路学习笔记公众号 Charger的动态电源路径管理&#xff08;DPPM&#xff09; 前篇内容&#xff1a;①电池管理IC&#xff08;Charger&#xff09;了解一下&…...

大数据模型的选择与安装

大数据模型的选择和安装是一个复杂的过程&#xff0c;涉及多个因素&#xff0c;包括模型的通用能力、特定任务的性能、数据效率、评估完整性、成本以及部署的硬件和软件环境。以下是一些关于大数据模型选择与安装的考虑因素和步骤&#xff1a; 选择大数据模型的考虑因素&#…...

React 之 lazy(延迟加载)(十七)

lazy 能够让你在组件第一次被渲染之前延迟加载组件的代码。 在组件外部调用 lazy&#xff0c;以声明一个懒加载的 React 组件: import { lazy } from react;const MarkdownPreview lazy(() > import(./MarkdownPreview.js)); 配合 Suspense 实现懒加载组件 //App.js imp…...

Node.js -- 会话控制

文章目录 1. 会话介绍2. cookie 相关操作2.1 cookie 设置2.2 删除 cookie2.3 获取cookie 3. session 相关操作4. cookie 和session 的区别5. 补充知识 -- CSRF跨站请求伪造6. token 1. 会话介绍 所谓会话控制就是对会话进行控制 HTTP是一种无状态的协议&#xff0c;它没有办法…...

做抖店不能踩的几个坑,新手要照做,老玩家要听劝~

我是王路飞。 很多人都说抖店的运营很简单&#xff0c;选选品、对接一下达人&#xff0c;就可以坐等店铺出单了。 这话骗骗还没开店的小白也就得了&#xff0c;但凡做抖店超过一个月的&#xff0c;都不会相信这句话。 细心耐心是做抖店最基本的态度。 拿到一个好结果的前提…...

【Kibana】快速上手Kibana平台(KQL)

文章目录 快速使用Kibana平台常用查询语句KQL基本查询覆合查询模糊查询 目前市面上大部分的公司的日志系统都是使用ELK系统&#xff0c;因此我们进行工作必须得掌握Kibana平台的基本使用&#xff0c;这里主要说明怎么“快速使用Kibana平台”以及记录一些常用的“KQL语言”。 快…...

全方位入门git-慕课网 笔记

目录 【上传github忽略某些文件】【配置用户名和邮箱】【想要删除不需要的文件时如何进行操作】【想要给文件重命名如何操作】【想要移动文件到其他位置时如何操作】【文件有变化时&#xff0c;如何查看前后变化】【操作失误的情况下如何实现一键还原】【不再追踪时如何实现撤销…...

使用 Docker 部署 TaleBook 私人书籍管理系统

1&#xff09;项目介绍 GitHub&#xff1a;https://github.com/talebook/talebook Talebook 是一个简洁但强大的私人书籍管理系统。它基于 Calibre 项目构建&#xff0c;具备书籍管理、在线阅读与推送、用户管理、SSO 登录、从百度/豆瓣拉取书籍信息等功能。 友情提醒&#x…...

分布式系统的一致性与共识算法(一)

前言 etcd是线性一致性读&#xff0c;而zk却是顺序一致性读&#xff0c;再加上各种共识、强弱一致的名词&#xff0c;看到欸度时候总会混淆&#xff0c;这里会给出一些例子来帮助理解。 什么是一致性&#xff1f; 在谈到一致性这个词时&#xff0c;你会想到CAP理论的consist…...

创建一个Spring Boot项目

文章目录 一、如何创建一个Spring Boot项目1.1 项目创建&#xff1a;专业版 or 社区版 or 网站创建1.2 数据配置1.3 项目启动1.4 代码编写 二、Spring Boot 项目文件介绍三、Web服务器四、根据HTTP状态码解决bug4.1 4044.2 500 五、Spring VS Spring Boot VS Spring Web MVC5.1…...

ansible -playbook运维工具、语法、数据结构、命令用法、触发器、角色

目录 配置文件 基本语法规则&#xff1a; YAML支持的数据结构 playbook核心元素 ansible-playbook用法&#xff1a; 触发器 特点&#xff1a; 角色&#xff1a; 习题&#xff1a; 配置文件 playbook配置文件使用yaml语法&#xff0c;YAML 是一门标记性语言,专门用来写配…...

web前端之sass中的颜色函数、active按钮激活、hover鼠标悬浮、disabled禁用、scss循环、css

MENU 效果图htmlsassscss编译后的css页面css 效果图 注意查看蓝色按钮。 html <div class"box"><button class"btn type_1">按钮</button><button class"btn type_2">按钮</button><button class"btn ty…...

交通地理信息系统实习教程(二)

这篇文章服务于GIS背景用户以及有志于GIS的朋友 操作源数据位置&#xff1a;【免费】交通地理信息系统实习二源数据资源-CSDN文库 软件安装包位置&#xff1a;【免费】TransCad-交通地理信息系统软件资源-CSDN文库 一、最短路径分析 1.1软件启动说明 这里需要给出一个必要的…...

Shell脚本——批量清理Kubernetes集群中Evicted状态的pod

测试环境有一台宿主机出现了异常&#xff0c;大量的异常日志导致宿主机的磁盘使用率超过了85%&#xff0c;触发了上面的pod驱离策略&#xff0c;该宿主机上的的pod处于Evicted状态。在清理了磁盘之后&#xff0c;得手动处理掉这些Evicted状态的pod。 #!/bin/bash# 获取当前状态…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...

论文阅读:Matting by Generation

今天介绍一篇关于 matting 抠图的文章&#xff0c;抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法&#xff0c;已经有很多的工作和这个任务相关。这两年 diffusion 模型很火&#xff0c;大家又开始用 diffusion 模型做各种 CV 任务了&am…...

云安全与网络安全:核心区别与协同作用解析

在数字化转型的浪潮中&#xff0c;云安全与网络安全作为信息安全的两大支柱&#xff0c;常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异&#xff0c;并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全&#xff1a;聚焦于保…...