当前位置: 首页 > 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进行打印。

http://www.lryc.cn/news/248527.html

相关文章:

  • 在网络安全护网中,溯源是什么?
  • 【刷题】动态规划
  • hadoop操作
  • 角色管理--高级产品经理岗
  • nginx: [alert] could not open error log file
  • MySQL数据库:外键、唯一键、唯一索引
  • CSS核心功能手册:从熟悉到精通
  • 编程的重要性及解决技术难题的方法
  • 如何成为一名高效的前端开发者(10X开发者)
  • Docker port 命令
  • PostgreSQL-SQL联表查询LEFT JOIN 数据去重复
  • Golang与MongoDB的完美组合
  • 初识Java 18-2 泛型
  • vue分环境打包及案例代码
  • 基于springboot+vue的在线考试系统(前后端分离)
  • 重装linux后需要做的配置
  • 【华为数通HCIP | 网络工程师】821刷题日记-IS-IS(2)
  • Linux系统-----进程管理(进程的创建与控制)
  • Unity 获取物体的子物体的方法
  • RocketMQ 读写压测
  • PHP调用API接口的方法及实现(一键采集淘宝商品详情数据)
  • 得物App安卓冷启动优化-Application篇
  • 【实战教程】PHP与七牛云的完美对接
  • Go 接口:nil接口为什么不等于nil?
  • (UM1724) STM32 Nucleo-64 boards User manual
  • SourceInsight - Relation Windows
  • 二维数组处理
  • 线性表——(2)线性表的顺序存储及其运算的实现
  • 数据结构 -- 图论之最小生成树
  • 【已解决】游戏缺少xinput1_3.dll的详细解决方案与详情解析