logback.xml自定义标签节点
logback.xml自定义标签节点
问题
<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="60 seconds" debug="false"><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="com.example.user.log.DataMaskingPatternLayout"><maskPattern>(\w+@\w+\.\w+)</maskPattern> <!-- Email --><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></layout></encoder></appender><root level="debug"><appender-ref ref="console"/></root>
</configuration>
自定义layout
public class DataMaskingPatternLayout extends PatternLayout {private List<String> maskPatterns = new ArrayList<>();/*** 标签属性的 set{TagName},add{TagName}, 都可以解析到标签* 这里就可以自动 注入 <maskPattern/>标签* @param maskPattern*/public void setMaskPattern(String maskPattern) {maskPatterns.add(maskPattern);}
}
今天的目的不是讨论自定义layout,而是如何接收自定义标签值
像这里,我们定义了<maskPattern> 标签,然后要接收这个标签内的值 ,不难发现,只要我们在对应的java代码中增加这个标签属性名称的 set或者add 方法名就可以了,这就很奇怪了,是怎么实现的呢?
原理
- 首先,logback会将自定义的结点封装成一个Action,而且是
ImplicitAction - 然后在运行时取出对应的Action, 如果是属性值方式,则 通过
NestedBasicPropertyIA实现类
//NestedBasicPropertyIA.javapublic void body(InterpretationContext ec, String body) {String finalBody = ec.subst(body);// get the action data object pushed in isApplicable() method callIADataForBasicProperty actionData = (IADataForBasicProperty) actionDataStack.peek();switch (actionData.aggregationType) {case AS_BASIC_PROPERTY:actionData.parentBean.setProperty(actionData.propertyName, finalBody);break;case AS_BASIC_PROPERTY_COLLECTION:actionData.parentBean.addBasicProperty(actionData.propertyName, finalBody);break;default:addError("Unexpected aggregationType " + actionData.aggregationType);}
}
交给 PropertySetter
public void setProperty(String name, String value) {if (value == null) {return;}Method setter = findSetterMethod(name);if (setter == null) {addWarn("No setter for property [" + name + "] in " + objClass.getName() + ".");} else {try {setProperty(setter, name, value);} catch (PropertySetterException ex) {addWarn("Failed to set property [" + name + "] to value \"" + value + "\". ", ex);}}
}//找到属性名称的方法
private Method findSetterMethod(String name) {String propertyName = BeanUtil.toLowerCamelCase(name);return beanDescription.getSetter(propertyName);
}public class BeanDescription {//propertyNameToGetter – map of property names to the associated getter. //propertyNameToSetter – map of property names to the associated setter. //propertyNameToAdder – map of property names to the associated adder.private final Class<?> clazz;private final Map<String, Method> propertyNameToGetter;private final Map<String, Method> propertyNameToSetter;private final Map<String, Method> propertyNameToAdder;
}
这里就可以发现,通过添加标签属性的 set或者add方法,就可以将自定义的标签内的值注入
相关文章:
logback.xml自定义标签节点
logback.xml自定义标签节点 问题 <?xml version"1.0" encoding"UTF-8" ?> <configuration scan"true" scanPeriod"60 seconds" debug"false"><appender name"console" class"ch.qos.logb…...
探索DevExpress WinForms:.NET世界中的UI库之星
开篇概述 作为一名资深的技术专家,我对.NET开发和UI库有着深入的了解。今天,我要向您介绍的是DevExpress WinForms —— 一款在.NET开发领域广受欢迎的开源UI库。它以其强大的功能、优雅的设计和卓越的性能,成为了众多开发者的首选。 主体讲解…...
零基础学习Redis(4) -- 常用数据结构介绍
我们之前提到过,redis中key只能是字符串类型,而value有多种类型。 redis中的数据结构有自己独特的实现方式能根据特定的场景进行优化 1. string(字符串) 内部编码: raw:最基本的字符串,类比我们平常使用的Stringin…...
Python实现水果忍者(开源)
一、整体介绍: 1.1 前言: 游戏代码基于Python制作经典游戏案例-水果忍者做出一些改动,优化并增加了一些功能。作为自己Python阶段学习的结束作品,文章最后有源码链接。 1.2 Python主要知识: (1…...
Windows自动化3️⃣WindowsPC拽起时长问题解决方案
问题描述: Windows应用从点击, 到加载完成, 需要一定的时间后台是否已经启动过当前程序?启动后, 前后台应用关闭问题等 我的解决思路: 首先检查进程 , 当前进程是否在运行, 如果进程在运行, 需要先关闭进程 关闭进程后, 开始我们的自动化流程, 去拽起 应用 拽起应用后, 可以先…...
一篇文章入门Java虚拟机(JVM)
JVM全称是Java Virtual Machine,中文译名Java虚拟机。本质上是一个运行在计算机上的程序 一,JVM的功能 功能描述解释和运行对字节码文件中的指令,实时的解释成机器码,让计算机执行内存管理自动为对象、方法等分配内存࿱…...
vue3里面的组件实例类型(包括原生的html标签类型)
在 通过 ref(null)获取组件的时候,我们想要为 组件标注组件类型,可以通过 any 类型来进行标注,但是很明显,这些的代码很不优雅,所以我们可以利用 vue3 里面的 InstanceType 来进行类型标注 这是…...
谷歌正式开放Imagen 3访问权限!OpenAI的GPT-4o连续两周迎来两次更新!|AI日报
文章推荐 马斯克Grok 2打响反内容限制第一枪,盛大网络狂欢!一起来看网友花式整活! GPT-4o一天迎来2大劲敌!Grok-2发布测试版!Gemini Live即刻上线! 今日热点 OpenAI发布chatgpt-4o-latest AI模型&#…...
C语言内存操作函数
目录 一. C语言内存操作函数 1. memcpy的使用和模拟实现 2. memmove函数 3. memset函数 4. memcmp函数 一. C语言内存操作函数 随着知识的不断积累,我们所想要实现的目标程序就会更加复杂,今天我们来学习一个新的知识叫做C语言内存操作函数&#x…...
深入探索 PyTorch:torch.nn.Parameter 与 torch.Tensor 的奥秘
标题:深入探索 PyTorch:torch.nn.Parameter 与 torch.Tensor 的奥秘 在深度学习的世界里,PyTorch 以其灵活性和易用性成为了众多研究者和开发者的首选框架。然而,即使是经验丰富的 PyTorch 用户,也可能对 torch.nn.Pa…...
成为Python砖家(1): 在本地查询Python HTML文档
目的 Python3 官方文档位于 https://docs.python.org/3/ , 有时候网络无法连接,或者连接速度慢, 这对于学习 Python 时的反馈造成了负面影响。准备一份本地 Python 文档可以让反馈更加及时。 下面给出 macOS 和 Win11 下的 Python 离线文档…...
深度学习基础—RMSprop算法与Adam 优化算法
1.RMSprop算法 1.1.算法流程 除了动量梯度下降法,RMSprop算法也可以加快梯度下降,这个算法的算法流程如下:深度学习基础—动量梯度下降法http://t.csdnimg.cn/zeGRo 1.2.算法原理 和动量梯度下降不同的是,对dW和db的变成了平方项…...
单片机原理及技术(六)—— 中断系统的工作原理
目录 一、AT89S51中断技术概述 二、AT89S51中断系统结构 2.1 中断请求源 2.2 中断请求标志寄存器 2.2.1 TCON 寄存器 2.2.2 SCON 寄存器 三、中断允许与中断优先级的控制 3.1 中断允许寄存器 IE 3.2 中断优先级寄存器 IP 四、响应中断请求的条件 五、外部中断的触发…...
Angular路由使用
Angular路由是Angular框架中一个非常重要的特性,开发者可以根据URL的不同来动态地加载和显示不同的组件,从而构建出单页面应用(SPA)。 以下是Angular路由使用的基本步骤和要点: 1. 安装和配置路由模块 首先…...
【JVM】深入理解类加载机制(一)
深入理解类加载机制 Klass模型 Java的每个类,在JVM中都有一个对应的Klass类实例与之对应,存储类的元信息如:常量池、属性信息、方法信息…从继承关系上也能看出来,类的元信息是存储在元空间的。普通的Java类在JVM中对应的是InstanceKlass(C)…...
区块链浏览器需求整理
用户需求 普通用户 便捷查询交易记录:能够轻松找到自己或特定地址的交易详情,包括交易时间、金额、状态等。查看账户余额:实时了解地址的余额情况。追踪资产流向:了解自己的资产在区块链上的转移路径。 开发者 智能合约调试&a…...
Laravel 表单验证功能重定向判断
判断主要针对 API 请求和普通页面请求,即 API 的表单验证失败直接响应 JSON,而页面的表单验证失败正常重定向。 看网上基本上是继承 FormRequest 类来实现,其实直接修改异常处理的 Handler 类即可,非常简单。 打开 app/Exception…...
MATLAB口罩检测系统
一、应用背景 作为数字图像处理和计算机视觉领域的一个重要组成部分,利用摄像机对图像进行采集,从图像中检测人脸并进行口罩穿戴的识别的有着非常重要的研究意义和应用价值。面对突如其来的新型肺炎疫情,人们生活秩序被严重打乱。跟普通流感…...
LeetCode 第三十一天 2024.8.18
1. :买卖股票的最佳时机 题目链接: 121. 买卖股票的最佳时机 - 力扣(LeetCode) 应用条件: 难点: # 确定dp数组(dp table)以及下标的含义:dp数组由len(prices)个[][]组成ÿ…...
Linux驱动学习之点灯(一)
学习不同的板子我们都是从点灯开始,linux驱动也不例外 驱动开发基础知识 何为驱动? 驱使硬件正常工作的代码就叫做驱动。 在一些mcu里: 无非就是直接操作寄存器,或者用库函数初始化外设,使外设正常工作如初始化iic&…...
VisionPro —— CogImageFileTool图像文件管理实战解析
1. CogImageFileTool核心功能解析 第一次接触CogImageFileTool时,我完全被它强大的图像管理能力震撼到了。这个工具就像工业视觉领域的"智能文件管家",专门处理图像文件的读写和存储问题。想象一下,你每天要处理上千张生产线上的产…...
Hunyuan模型如何降本增效?1.8B边缘部署实战案例分享
Hunyuan模型如何降本增效?1.8B边缘部署实战案例分享 1. 模型介绍与核心优势 混元翻译模型1.5版本带来了两个重要更新:18亿参数的HY-MT1.5-1.8B和70亿参数的HY-MT1.5-7B。这两个模型都专注于支持33种语言之间的互译,特别包含了5种民族语言及…...
Awoo Installer:让Switch游戏安装像呼吸一样简单
Awoo Installer:让Switch游戏安装像呼吸一样简单 【免费下载链接】Awoo-Installer A No-Bullshit NSP, NSZ, XCI, and XCZ Installer for Nintendo Switch 项目地址: https://gitcode.com/gh_mirrors/aw/Awoo-Installer 还在为Switch游戏安装的各种繁琐步骤头…...
UDOP-large高性能部署:Tesseract OCR预处理与UDOP-large联合加速方案
UDOP-large高性能部署:Tesseract OCR预处理与UDOP-large联合加速方案 1. 引言:当文档理解遇上效率瓶颈 想象一下,你手头有几百份英文PDF报告需要处理。你需要从中提取标题、摘要,甚至表格里的关键数据。传统的方法是:…...
Flutter状态管理实战:ChangeNotifier与Provider的完美搭配(附完整代码)
Flutter状态管理实战:ChangeNotifier与Provider的完美搭配 在Flutter开发中,状态管理一直是构建复杂应用的核心挑战。当UI需要根据数据变化动态更新时,如何高效、优雅地管理状态流转,直接决定了应用的性能和可维护性。本文将深入…...
像素史诗惊艳效果展示:10份高质量研报生成过程与成品对比
像素史诗惊艳效果展示:10份高质量研报生成过程与成品对比 1. 像素史诗:当AI研究遇上像素艺术 在数字内容创作领域,一款名为像素史诗(Pixel Epic)的工具正在重新定义研究报告的生成方式。这款基于AgentCPM-Report大模型构建的智能终端&#…...
手把手教你用UML用例图梳理业务流程(附真实项目案例)
实战指南:用UML用例图重构电商订单系统业务流程 1. 为什么用例图是需求分析的基石 在软件开发的混沌初期,当产品经理、开发者和业务方还在用各自的语言描述需求时,UML用例图就像一盏明灯,它能跨越专业术语的鸿沟,用可视…...
SimCLR揭秘:自监督学习中的对比学习艺术
1. 自监督学习与对比学习的革命性结合 第一次听说SimCLR这个名词时,我正被海量无标注图像数据的处理问题困扰。传统监督学习需要大量人工标注,成本高得吓人。而SimCLR的出现,就像给计算机视觉领域投下了一颗震撼弹——原来模型可以自己教自己…...
【原创】金三银四末班车!4个高薪安全岗,2W月短期项目、百万年薪云架构师,速来!
【原创】金三银四末班车!4个高薪安全岗,2W/月短期项目、百万年薪云架构师,速来! 金三银四虽然接近尾声,但好岗位从不等人!这次我们挖到了4个含金量超高的信息安全岗位,覆盖北京、深圳、上海、厦…...
当AI学会“越狱“与“签名“:大模型 安全的攻与防
当AI学会"越狱"与"签名":大模型安全的攻与防引言2023年以来,以ChatGPT、GPT-4、LLaMA、Qwen为代表的大语言模型(Large Language Models, LLMs)席卷了几乎所有行业。然而,能力越大,风险…...
