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

聊聊logback的addtivity属性

本文主要研究一下logback的addtivity属性

LoggerModel

ch/qos/logback/classic/model/LoggerModel.java

@PhaseIndicator(phase = ProcessingPhase.SECOND)
public class LoggerModel extends Model {private static final long serialVersionUID = 5326913660697375316L;String name;String level;String additivity;//......
}    

LoggerModel定义了additivity属性

LoggerAction

ch/qos/logback/classic/joran/action/LoggerAction.java

public class LoggerAction extends BaseModelAction {@Overrideprotected boolean validPreconditions(SaxEventInterpretationContext ic, String name, Attributes attributes) {PreconditionValidator validator = new PreconditionValidator(this, ic, name, attributes);validator.validateNameAttribute();return validator.isValid();}@Overrideprotected Model buildCurrentModel(SaxEventInterpretationContext interpretationContext, String name,Attributes attributes) {LoggerModel loggerModel = new LoggerModel();String nameStr = attributes.getValue(NAME_ATTRIBUTE);loggerModel.setName(nameStr);String levelStr = attributes.getValue(JoranConstants.LEVEL_ATTRIBUTE);loggerModel.setLevel(levelStr);String additivityStr = attributes.getValue(JoranConstants.ADDITIVITY_ATTRIBUTE);loggerModel.setAdditivity(additivityStr);return loggerModel;}
}

LoggerAction的buildCurrentModel方法会读取additivity属性,然后设置到loggerModel

LoggerModelHandler

ch/qos/logback/classic/model/processor/LoggerModelHandler.java

public class LoggerModelHandler extends ModelHandlerBase {Logger logger;boolean inError = false;//......@Overridepublic void handle(ModelInterpretationContext mic, Model model) throws ModelHandlerException {inError = false;LoggerModel loggerModel = (LoggerModel) model;String finalLoggerName = mic.subst(loggerModel.getName());LoggerContext loggerContext = (LoggerContext) this.context;logger = loggerContext.getLogger(finalLoggerName);String levelStr = mic.subst(loggerModel.getLevel());if (!OptionHelper.isNullOrEmpty(levelStr)) {if (JoranConstants.INHERITED.equalsIgnoreCase(levelStr) || NULL.equalsIgnoreCase(levelStr)) {if(Logger.ROOT_LOGGER_NAME.equalsIgnoreCase(finalLoggerName)) {addError(ErrorCodes.ROOT_LEVEL_CANNOT_BE_SET_TO_NULL);} else {addInfo("Setting level of logger [" + finalLoggerName + "] to null, i.e. INHERITED");logger.setLevel(null);}} else {Level level = Level.toLevel(levelStr);addInfo("Setting level of logger [" + finalLoggerName + "] to " + level);logger.setLevel(level);}}String additivityStr = mic.subst(loggerModel.getAdditivity());if (!OptionHelper.isNullOrEmpty(additivityStr)) {boolean additive = OptionHelper.toBoolean(additivityStr, true);addInfo("Setting additivity of logger [" + finalLoggerName + "] to " + additive);logger.setAdditive(additive);}mic.pushObject(logger);}//......
}    

LoggerModelHandler的handle方法会读取additivityStr,然后设置到logger中

Logger

ch/qos/logback/classic/Logger.java

public final class Loggerimplements org.slf4j.Logger, LocationAwareLogger, LoggingEventAware, AppenderAttachable<ILoggingEvent>, Serializable {//....../*** The parent of this category. All categories have at least one ancestor which* is the root category.*/transient private Logger parent;/*** Additivity is set to true by default, that is children inherit the appenders* of their ancestors by default. If this variable is set to <code>false</code>* then the appenders located in the ancestors of this logger will not be used.* However, the children of this logger will inherit its appenders, unless the* children have their additivity flag set to <code>false</code> too. See the* user manual for more details.*/transient private boolean additive = true;//......public void callAppenders(ILoggingEvent event) {int writes = 0;for (Logger l = this; l != null; l = l.parent) {writes += l.appendLoopOnAppenders(event);if (!l.additive) {break;}}// No appenders in hierarchyif (writes == 0) {loggerContext.noAppenderDefinedWarning(this);}}void recursiveReset() {detachAndStopAllAppenders();localLevelReset();additive = true;if (childrenList == null) {return;}for (Logger childLogger : childrenList) {childLogger.recursiveReset();}}//......
}        

Logger的callAppenders方法会先打印自己的appender,然后逐层遍历parent进行打印,若additive为false则不通过parent的appender打印

小结

logback的Logger提供了addtivity属性,默认为true,即除了自己appender,还会通过parent的appender进行打印,设置为false则不通过parent的appender进行打印。

相关文章:

聊聊logback的addtivity属性

序 本文主要研究一下logback的addtivity属性 LoggerModel ch/qos/logback/classic/model/LoggerModel.java PhaseIndicator(phase ProcessingPhase.SECOND) public class LoggerModel extends Model {private static final long serialVersionUID 5326913660697375316L;S…...

在网络安全护网中,溯源是什么?

在网络安全护网中&#xff0c;溯源是什么&#xff1f; 在网络安全护网中&#xff0c;溯源是指通过收集、分析和解释数字证据来追踪和还原网络攻击或其他网络犯罪活动的过程。它旨在确定攻击者的身份、行为和意图&#xff0c;以便采取适当的对策&#xff0c;并为法律机构提供必…...

【刷题】动态规划

动态规划 139. 单词拆分&#xff08;一维&#xff09; 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&…...

hadoop操作

文件操作 注意当前所在的路径&#xff0c;创建一个mytest文件夹 创建一个1.txt文件 将1.txt文件移动到mytest中&#xff0c;通过mv改名字&#xff0c;然后查看mytest文件夹的txt文件变成了test.txt 删除文件 上传下载文件 新建1.txt 然后编辑它 随便输入什么 上传 然后看看网…...

角色管理--高级产品经理岗

研发组织管理--角色管理--高级产品经理岗 定位 产品从规划到推进落地的绝对主力&#xff0c;同时能赋能新人&#xff0c;带领新人高质&#xff0c;高效的完成产品的各项工作&#xff1b; 所需资质 某一领域产品专家&#xff0c;有产品架构能力&#xff0c;熟悉产品落地流程…...

nginx: [alert] could not open error log file

先把cmd的报错信息粘出来 nginx: [alert] could not open error log file: CreateFile() “logs/error.log” failed (3: The system cannot find the path specified) 2023/11/29 11:27:37 [emerg] 5040#18772: CreateDirectory() “D:\enviroment\nginx-1.24.0\conf/temp/cli…...

MySQL数据库:外键、唯一键、唯一索引

目录 说明 一、如果要使用外键&#xff0c;表的存储引擎选择哪个&#xff1f; 1.1 答 1.2 示范 1.2.1 主表 &#xff08;1&#xff09;MyISAM的表&#xff1a;masterTable2 &#xff08;2&#xff09;InnoDB的表&#xff1a;masterTable1 1.2.2 从表 &#xff08;1&am…...

CSS核心功能手册:从熟悉到精通

CSS核心功能代码 文章目录 CSS核心功能代码[toc]参考HTML代码尺寸操作设置元素尺寸内边距外边距设置默认布局边距用途和使用场景&#xff1a; 背景设置**背景颜色 (background-color)**:**背景图像 (background-image)**:**背景重复 (background-repeat)**:**背景位置 (backgro…...

编程的重要性及解决技术难题的方法

看到这个话题之后&#xff0c;出于好奇&#xff0c;使用某chat&#xff0c;输入相应主题得到的一篇文章&#xff0c;分享给大家。 PS&#xff1a;现在不同版本的chat和其快速更新升级也可以说是编程的结果&#xff0c;其重要性和发展历程也反映了编程的重要性。 一、编程的重要…...

如何成为一名高效的前端开发者(10X开发者)

如今&#xff0c;每个人都想成为我们所说的“10倍开发者”。然而&#xff0c;这个术语经常被误解和高估。 本质上&#xff0c;一个高效或者10倍开发者&#xff0c;在我看来&#xff0c;是指那些能够充分利用所有可用工具的人&#xff0c;通过让这些工具处理冗余和重复的任务&am…...

Docker port 命令

docker port&#xff1a;列出指定的容器的端口映射&#xff0c;或者查找将PRIVATE_PORT NAT到面向公众的端口。 语法 docker port [OPTIONS] CONTAINER [PRIVATE_PORT[/PROTO]]实例 查看容器mymysql的端口映射情况&#xff1a; docker port mymysql##效果如下&#xff1a; …...

PostgreSQL-SQL联表查询LEFT JOIN 数据去重复

我们在使用left join联表查询时&#xff0c;如果table1中的一条记录对应了table2的多条记录&#xff0c;则会重复查出id相同的多条记录。 1、解决方法一 SELECT t1.* FROM table1 t1 LEFT JOIN table2 t2 ON t1.id t2.tid 第一种方法我们发现还是有重复数据 2、解决方法二…...

Golang与MongoDB的完美组合

引言 在现代开发中&#xff0c;数据存储是一个至关重要的环节。随着数据量的增加和复杂性的提高&#xff0c;开发人员需要寻找一种高效、可扩展且易于使用的数据库解决方案。MongoDB作为一种NoSQL数据库&#xff0c;提供了强大的功能和灵活的数据模型&#xff0c;与Golang的高…...

初识Java 18-2 泛型

目录 构建复杂模型 类型擦除 C中的泛型 迁移的兼容性 类型擦除存在的问题 边界的行为 对类型擦除的补偿 创建类型实例 泛型数组 本笔记参考自&#xff1a; 《On Java 中文版》 构建复杂模型 泛型的一个优点就是&#xff0c;能够简单且安全地创建复杂模型。 【例子&am…...

vue分环境打包及案例代码

Vue分环境打包可以帮助我们针对不同的环境(如开发环境、测试环境、生产环境等)打包出不同的版本,以满足不同的需求。下面是一个简单的Vue分环境打包的示例代码: 安装cross-env: npm install --save-dev cross-env在项目的根目录下创建不同的环境配置文件,如test.env.js…...

基于springboot+vue的在线考试系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...

重装linux后需要做的配置

1. linux中 vim如果输入中文乱码 打开/etc/vim/vimrc输入&#xff1a; set fileencodingsutf-8,gbk set termencodingutf-8 set encodingutf-8 把vim的缩进格式顺便改了 http://t.csdnimg.cn/K3ncc 2. 配置sudo授权用户 3. 新导入项目后 , chmod -R x 添加权限 4. 查询主机i…...

【华为数通HCIP | 网络工程师】821刷题日记-IS-IS(2)

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…...

Linux系统-----进程管理(进程的创建与控制)

目录 前言 进程 1.基本概念 2.特征 3.Linux系统的进程 进程的创建 1. fork()函数 2. 多进程的创建与输出 进程的控制 1. exec()系列 2. wait() 函数 3. execl( )和fork( )联合使用 4. exit&#xff08; &#xff09; 前言 前面我们学习了Linux系统的基本指令以及如…...

Unity 获取物体的子物体的方法

Unity 中要获取物体的子物体&#xff0c;可以使用以下一些方法。 1、只获取一级节点的子物体&#xff1a; public Transform tran;// Start is called before the first frame updatevoid Start(){foreach (Transform child in tran){Debug.Log(child.name);}} 使用该方法只会…...

在FreeRTOS上为Zynq CAN驱动添加任务间通信:一个实用的数据收发框架搭建

在FreeRTOS上为Zynq CAN驱动构建高效任务间通信框架 当我们在Zynq平台上开发基于FreeRTOS的CAN总线应用时&#xff0c;如何安全高效地在中断服务程序(ISR)与任务之间传递数据&#xff0c;是构建稳定系统的关键挑战。本文将深入探讨一个经过实战检验的解决方案——通过消息队列和…...

Perl环境变量设置全攻略:从银河麒麟V10到CentOS的通用配置方法

Perl环境变量跨平台配置实战指南 在混合云和异构系统环境中&#xff0c;Perl作为系统管理和应用开发的重要工具&#xff0c;其环境配置的一致性直接影响脚本的跨平台运行能力。本文将深入探讨从银河麒麟V10到CentOS等主流Linux发行版的Perl环境变量配置方法论&#xff0c;帮助运…...

2007 Text 1

2007 Text 1...

从修车铺到世界冠军,从废塑料到再生资源:一场关于坚持与价值的时代对话

最近&#xff0c;张雪的故事刷屏了。这个14岁辍学、睡在修车铺阁楼、月薪300元的湖南山村少年&#xff0c;用了整整二十年&#xff0c;将自己亲手打造的摩托车送上了世界超级摩托车锦标赛&#xff08;WSBK&#xff09;的冠军领奖台。当五星红旗在葡萄牙阿尔加维国际赛道升起时&…...

Android音频开发避坑指南:用OboeTester的Device Report快速排查耳机兼容性问题

Android音频开发实战&#xff1a;用OboeTester精准诊断耳机兼容性问题 当你在星巴克掏出Type-C耳机准备调试刚写完的音频播放代码&#xff0c;却发现设备死活不出声——这种崩溃瞬间每个Android音频开发者都经历过。数字耳机兼容性问题就像薛定谔的猫&#xff0c;不到实际连接那…...

智能对话式开发:通过快马平台AI模型将你的想法直接变为cloud code应用

智能对话式开发&#xff1a;通过快马平台AI模型将你的想法直接变为cloud code应用 最近在尝试用AI辅助开发一个天气查询小工具&#xff0c;整个过程让我深刻体会到cloud code与AI结合的强大之处。传统开发需要自己写代码、调试、部署&#xff0c;而现在只需要用自然语言描述需…...

2025最权威的五大降重复率工具推荐榜单

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 基于自然语言处理以及机器学习算法的AI论文查重系统&#xff0c;会去分析文本语义&#xff0…...

python zipfile

# Python 的 zipfile&#xff1a;不只是打包文件那么简单 如果你用过压缩软件&#xff0c;大概知道 ZIP 格式是用来把多个文件打包成一个&#xff0c;顺便还能压缩节省空间。Python 里的 zipfile 模块就是干这个的&#xff0c;但它的能力远不止“打包”这么简单。 它到底是什么…...

S7-1200 PLC 高级语言SCL数控G代码功能块源文件解析及程序思路

S7-1200PLC 高级语言SCL数控G代码功能块源文件| S7-1200PLC 高级语言SCL数控G代码功能块源文件| S7-1200PLC 高级语言SCL数控G代码功能块源文件||| 整个G代码解析的程序做成了一个FB功能块,利用1200PLC内置的字符串控制指令来实现拆分提取字符串信息;整个程序的大概思路就是1.解…...

多年研究图像增强算法,包括但不限于:retinex,gamma,clahe,滤波算法。如果有需要此方面的需要,可以找我哦,理论算法打包带走

多年研究图像增强算法&#xff0c;包括但不限于&#xff1a;retinex&#xff0c;gamma&#xff0c;clahe&#xff0c;滤波算法。如果有需要此方面的需要&#xff0c;可以找我哦&#xff0c;理论算法打包带走...