聊聊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进行打印。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/196834.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法每日一练]-图论(保姆级教程 篇6(图上dp))#最大食物链 #游走

目录 题目&#xff1a;最大食物链 解法一&#xff1a; 解法二&#xff1a; 记忆化 题目&#xff1a;游走 思路&#xff1a; 题目&#xff1a;最大食物链 解法一&#xff1a; 我们标记f[i]是被f[x]捕食的点对应的类食物链数 不难得出&#xff1a; f[x]∑(f[i]) 首先从生…

206 反转链表

解题思路可以有两种方法&#xff1a;递归 or 迭代。 \qquad 迭代&#xff1a;通过使用for循环遍历&#xff0c;完成目标。方法直观&#xff0c;容易理解。 \qquad 递归&#xff1a;通过函数调用其自身&#xff0c;完成目标。递归最复杂、最重要的部分就是递归函数的构建&#…

【数据结构】——栈|队列(基本功能)

目录 栈 基本概念 栈的常见基本操作 栈的存储 ✌栈的基本操作实现 栈的构建 栈的初始化 入栈 打印栈 出栈 获取栈顶元素 获取栈的有效元素个数 判断栈是否为空 销毁栈 队列 基本概念 队列的常见基本操作 ✌队列的基本操作实现 队列的构建 初始化 入队列 出…

Spring Security 6.x 系列(9)—— 基于过滤器链的源码分析(二)

一、前言 在本系列文章&#xff1a; Spring Security 6.x 系列&#xff08;4&#xff09;—— 基于过滤器链的源码分析&#xff08;一&#xff09;中着重分析了Spring Security在Spring Boot 的自动配置、 DefaultSecurityFilterChain 的构造流程、FilterChainProxy 的构造流…

假设检验(四)(非参数假设检验)

文章目录 分布假设检验参考文献 在有些实际问题中&#xff0c;无法预知总体服从何种分布&#xff0c;而希望根据样本来检验对总体分布所提出的假设&#xff0c;或者想通过样本来检验对总体之间的关系所提出的假设。这一类问题就是非参数假设检验问题。非参数假设检验包括分布假…

【重点】【前缀和】560. 和为 K 的子数组

题目 解法1&#xff1a;哈希表 class Solution {public int subarraySum(int[] nums, int k) {int[] sumArray new int[nums.length];Map<Integer, Integer> sumToCountMap new HashMap<>();for (int i 0; i < nums.length; i) {if (i 0) {sumArray[i] n…

详解原生Spring当中的事务

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…

基于Langchain的txt文本向量库搭建与检索

这里的源码主要来自于Langchain-ChatGLM中的向量库部分&#xff0c;做了一些代码上的修改和封装&#xff0c;以适用于基于问题和包含数据库表描述的txt文件&#xff08;文件名为库表名&#xff0c;文件内容为库表中的字段及描述&#xff09;对数据库表进行快速检索。 中文分词…

Android 14 CarAudioService

文章目录 新功能AudioMirringoemCarService 新功能 AudioMirring 简单的说就是两个bus输出的是同一个音频数据。 构建的流程是&#xff1a; 一个输入src的bus&#xff0c;和两个输出dst的bus。 通过setParamter 设置到hal。 hal解析这些参数&#xff0c;将输入bus 的音频数据…

Spring Security 6.x 系列(8)—— 源码分析之配置器SecurityConfigurer接口及其分支实现

一、前言 本章主要内容是关于配置器的接口架构设计&#xff0c;任意找一个配置器一直往上找&#xff0c;就会找到配置器的顶级接口&#xff1a;SecurityConfigurer。 查看SecurityConfigurer接口的实现类情况&#xff1a; 在 AbstractHttpConfigurer 抽象类的下面可以看到所有…

idea类和方法模版

类模版 修改目标位置 class #if (${PACKAGE_NAME} && ${PACKAGE_NAME} ! "")package ${PACKAGE_NAME};#end #parse("File Header.java")/*** ${Description}* author whc ${YEAR}/${MONTH}/${DAY}* version v1.0 */public class ${NAME} { }inte…

【网络安全】虚假IP地址攻击如何防范?

在当今的网络时代&#xff0c;虚假IP地址攻击已成为一种新型的网络攻击方式&#xff0c;给网络安全带来了极大的威胁。那么&#xff0c;什么是虚假IP地址攻击&#xff1f;又如何进行溯源和防范呢&#xff1f;本文将为您揭开这一神秘面纱。 一、虚假IP地址攻击概述 虚假IP地址攻…

[python]离线加载fetch_20newsgroups数据集

首先手动下载这个数据包 http://qwone.com/~jason/20Newsgroups/20news-bydate.tar.gz 下载这个文件后和脚本放一起就行&#xff0c;然后 打开twenty_newsgroups.py文件&#xff08;在fetch_20newsgroups函数名上&#xff0c;右键转到定义即可找到&#xff09; 之后运行代码即…

羊大师教你如何有效应对冬季流感,保护自己与家人

羊大师教你如何有效应对冬季流感&#xff0c;保护自己与家人 随着冬季的临近&#xff0c;流感病毒将再次蔓延。如何预防冬季流感来袭&#xff0c;成为了许多人关注的话题。幸运的是&#xff0c;我们可以采取一系列的预防措施来保护自己和家人&#xff0c;避免被流感侵袭。下面…

【Altium designer 20】

Altium designer 20 1. Altium designer 201.1 原理图库1.1.1 上划岗 在字母前面加\在加字母1.1.2 自定义快捷键1.1.3 对齐1.1.4 在原有的电路图中使用封装1.1.5 利用excel创建IC类元件库1.1.6 现有原理图库分类以及调用1.1.7 现有原理图库中自动生成原理图库 1.2 绘制原理图1.…

【初阶解法-数据结构】包含min函数的栈(代码+图示)

【数据结构】刷题-包含min函数的栈(代码图示)-初阶解法 文章目录 【数据结构】刷题-包含min函数的栈(代码图示)-初阶解法题目提炼题目要求分析题目总结思路代码时间/空间复杂度进阶版 题目 定义栈的数据结构&#xff0c;请在该类型中实现一个能够得到栈中所含最小元素的 min 函…

Ubuntu22.04 交叉编译mp4V2 for Rv1106

一、配置工具链环境 sudo vim ~/.bashrc在文件最后添加 export PATH$PATH:/opt/arm-rockchip830-linux-uclibcgnueabihf/bin 保存&#xff0c;重启机器 二、下载mp4v2 下载路径&#xff1a;MP4v2 | mp4v2 三、修改CMakeLists.txt 四、执行编译 mkdir build cd buildcmak…

羊大师教你如何在冬天运动,然后悄悄惊艳所有人

羊大师教你如何在冬天运动&#xff0c;然后悄悄惊艳所有人 寒冷的冬季&#xff0c;寂静的清晨&#xff0c;你是否也曾感到在冰冷的天气中进行锻炼是一件非常困难的事情&#xff1f;但是&#xff0c;现在请跟随小编羊大师一起来探索冬季秘密运动&#xff0c;让你在春节惊艳众人…

人工智能_机器学习060_核函数对应数学公式_数据空间错位分割_简单介绍_以及核函数总结---人工智能工作笔记0100

我们之前做的都是线性分类问题,那么需要一根线来分割类别,但是,如果出现了,环形数据,我们知道,在二维中我们就无法分割了,那么有没有什么办法分割呢? 实际上是有的,可以看到,我们可以把数据进行升维,可以看到,如果把数据升高到2维度以上,可以看到,神奇的一幕出现了,这个时候,因…

认知觉醒(三)

认知觉醒(三) 第二节 焦虑&#xff1a;焦虑的根源 焦虑肯定是你的老朋友了&#xff0c;它总像背景音乐一样伴随着你&#xff0c;我们虽对它极为熟悉&#xff0c;却从来不知道它究竟是谁。我也是默默忍受多年之后&#xff0c;终于在某天鼓足气力和它对视了一番&#xff0c;从…