聊聊logback的isDebugEnabled

本文主要研究一下logback的isDebugEnabled

isDebugEnabled

public final class Loggerimplements org.slf4j.Logger, LocationAwareLogger, LoggingEventAware, AppenderAttachable<ILoggingEvent>, Serializable {//......public boolean isDebugEnabled() {return isDebugEnabled(null);}public boolean isDebugEnabled(Marker marker) {final FilterReply decision = callTurboFilters(marker, Level.DEBUG);if (decision == FilterReply.NEUTRAL) {return effectiveLevelInt <= Level.DEBUG_INT;} else if (decision == FilterReply.DENY) {return false;} else if (decision == FilterReply.ACCEPT) {return true;} else {throw new IllegalStateException("Unknown FilterReply value: " + decision);}}        }        

isDebugEnabled先通过callTurboFilters获取debug级别的FilterReply,若为DENY返回false,若为ACCEPT返回true,若为NEUTRAL则判断effectiveLevelInt是否小于等于DEBUG_INT

callTurboFilters

    /*** Method that calls the attached TurboFilter objects based on the logger and* the level.* * It is used by isYYYEnabled() methods.* * It returns the typical FilterReply values: ACCEPT, NEUTRAL or DENY.* * @param level* @return the reply given by the TurboFilters*/private FilterReply callTurboFilters(Marker marker, Level level) {return loggerContext.getTurboFilterChainDecision_0_3OrMore(marker, this, level, null, null, null);}

callTurboFilters从loggerContext获取getTurboFilterChainDecision_0_3OrMore

getTurboFilterChainDecision_0_3OrMore

ch/qos/logback/classic/LoggerContext.java

    final FilterReply getTurboFilterChainDecision_0_3OrMore(final Marker marker, final Logger logger, final Level level,final String format, final Object[] params, final Throwable t) {if (turboFilterList.size() == 0) {return FilterReply.NEUTRAL;}return turboFilterList.getTurboFilterChainDecision(marker, logger, level, format, params, t);}

该方法先判断turboFilterList是否为空,为空则返回NEUTRAL,否则执行turboFilterList.getTurboFilterChainDecision

getTurboFilterChainDecision

ch/qos/logback/classic/spi/TurboFilterList.java

    public FilterReply getTurboFilterChainDecision(final Marker marker, final Logger logger, final Level level,final String format, final Object[] params, final Throwable t) {final int size = size();// if (size == 0) {// return FilterReply.NEUTRAL;// }if (size == 1) {try {TurboFilter tf = get(0);return tf.decide(marker, logger, level, format, params, t);} catch (IndexOutOfBoundsException iobe) {return FilterReply.NEUTRAL;}}Object[] tfa = toArray();final int len = tfa.length;for (int i = 0; i < len; i++) {// for (TurboFilter tf : this) {final TurboFilter tf = (TurboFilter) tfa[i];final FilterReply r = tf.decide(marker, logger, level, format, params, t);if (r == FilterReply.DENY || r == FilterReply.ACCEPT) {return r;}}return FilterReply.NEUTRAL;}

getTurboFilterChainDecision在只有1个TurboFilter的时候执行decide方法,否则遍历TurboFilter,挨个执行decide,一但有DENY或者ACCEPT直接返回,否则最后返回NEUTRAL

小结

logback的isDebugEnabled先通过callTurboFilters获取debug级别的FilterReply,若为DENY返回false,若为ACCEPT返回true,若为NEUTRAL则判断effectiveLevelInt是否小于等于DEBUG_INT。callTurboFilters是一系列isYYYEnabled()共用的,它在turboFilterList是否为空,为空则返回NEUTRAL,在只有1个TurboFilter的时候执行decide方法,否则遍历TurboFilter,挨个执行decide,一但有DENY或者ACCEPT直接返回,否则最后返回NEUTRAL。

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

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

相关文章

突发!奥特曼宣布暂停ChatGPT Plus新用户注册!

大新闻&#xff01;就在刚刚&#xff01; OpenAI的CEO Sam Altman宣布暂停ChatGPT Plus 新用户注册&#xff01; Sam Altman对此解释道&#xff1a; 由于OpenAI开发日后ChatGPT使用量的激增超出了我们的承受能力&#xff0c;我们希望确保每个人都有良好的体验。 您仍然可以在a…

msvcp120.dll下载_msvcp120.dll文件丢失解决[dll系统文件修复]

msvcp120.dll是Microsoft Visual C库中的一个重要组件&#xff0c;属于Microsoft Visual C 2005 Redistributable Package。它提供了许多用于执行C程序所需的函数。Visual C是一款流行的集成开发环境&#xff08;IDE&#xff09;&#xff0c;广泛应用于游戏、视频和图形处理等领…

keepalived+haproxy配置集群和负载均衡

1、简介 1.1. Keepalived Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备…

samba 共享目录write permission deny问题修复 可读取内容但不可修改 删除 新增文件

关于 update/delete/write permission deny问题修复 0.首先在服务器端执行testparm -s &#xff0c;测试 Samba 配置并显示结果。需确保服务器端参数 read only No &#xff0c;共享目录有写入权限 一、若配置了允许匿名访问&#xff0c;使用匿名访问来操作smb需要做如下处理…

【PyQt小知识 - 2】:QTextEdit内容的更新和获取、隐藏或显示滚动条、光标插入文本、文本自适应移动

文章目录 QTextEdit更新和获取内容隐藏或显示滚动条光标插入文本文本自适应移动 QTextEdit 更新和获取内容 更新&#xff1a;QTextEdit().setText(text) 或 QTextEdit().setPlainText(text) 获取&#xff1a;QTextEdit().toPlainText() setText()和setPlainText()的区别&…

Android10 状态栏蓝牙电量图标

Android10 源码状态栏蓝牙电量图标相关类 BatteryMeterDrawableBase&#xff1a;电量图标基类 BluetoothDeviceLayerDrawable&#xff1a; LayerDrawable 包含蓝牙设备图标和电池电量图标 BatteryMeterDrawable&#xff1a;内部类&#xff0c;继承自BatteryMeterDrawableBase B…

什么是线段树?

线段树 概述 线段树&#xff08;Segment Tree&#xff09;是一种二叉树数据结构&#xff0c;通常用于解决与区间或者段相关的问题。它主要用于处理一维区间的查询和更新操作&#xff0c;例如&#xff0c;查找区间内的最小值、最大值、和、平均值等。线段树是一种灵活而强大的…

大文件分片上传、断点续传、秒传

小文件上传 后端&#xff1a;SpringBootJDK17 前端&#xff1a;JavaScriptsparkmd5.min.js 一、依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.2</ve…

1 Supervised Machine Learning Regression and Classification

文章目录 Week1OverViewSupervised LearningUnsupervised LearningLinear Regression ModelCost functionGradient Descent Week2Muliple FeatureVectorizationGradient Descent for Multiple RegressionFeature ScalingGradient DescentFeature EngineeringPolynomial Regress…

LY/T 3134-2019 室内木质隔声门检测

室内木质隔声门是指能够满足一定隔声等级要求的室内木质门&#xff0c;根据隔声性能的不同&#xff0c;分为Ⅰ级室内木质隔声门。Ⅱ级室内木质隔声门、Ⅲ级室内木质隔声门、Ⅳ级木质隔声门。 LY/T 3134-2019 室内木质隔声门检测项目 测试项目 测试标准 外观 LY/T 1923 尺寸…

UE5 - UI Material Lab 学习笔记

1、学习资料收集 UI Material Lab : https://www.unrealengine.com/marketplace/zh-CN/product/ui-material-lab 视频1&#xff1a;https://www.bilibili.com/video/BV1Hm4y1t7Kn/?spm_id_from333.337.search-card.all.click&vd_source707ec8983cc32e6e065d5496a7f79ee6 视…

记录一次 添加脚本的记录+改错记录

1.Update 和 Delete 一定要记得where条件 update 表名称 set 字段1‘修改的值’ &#xff08;单引号&#xff09; where 字段‘’ and Aid‘’; update jxkh22 set JXKH2200001 ,JXKH2201002 where B003 and JXKH22034;delete from table_name where condition delete from …

Linux控制---进程程序替换

前言&#xff1a;前面我们学洗了Linux进程退出的相关知识&#xff0c;了解了什么是进程退出&#xff0c;已经进程等待的相关话题&#xff0c;今天&#xff0c;我们来学习Linux中的进程程序替换&#xff0c;进程程序替换在Linux中可以用于实现新程序的启动、程序升级、多进程程序…

11.10 知识总结(数据的增删改查、如何创建表关系、Django框架的请求生命周期流程图)

一、 数据的增删改查 1.1 用户列表的展示 把数据表中得用户数据都给查询出来展示在页面上 添加数据 id username password gender age action 修改 删除 1.2 修…

【数据库开发】DataX开发环境的安装部署(Python、Java)

文章目录 1、简介1.1 DataX简介1.2 DataX功能1.3 支持的数据通道 2、DataX安装配置2.1 DataX2.2 Java2.3 Python 3、DataX Web安装配置3.1 mysql3.2 DataX Web3.2.1 简介3.2.2 架构图3.2.3 依赖环境3.2.4 安装 4、入门使用4.1 DataX自带打印示例测试4.2 DataX生成任务模板文件4…

kubernetes集群编排——istio

官网&#xff1a;https://istio.io/latest/zh/about/service-mesh/ 部署 [rootk8s2 ~]# tar zxf istio-1.19.3-linux-amd64.tar.gz [rootk8s2 ~]# cd istio-1.19.3/[rootk8s2 istio-1.19.3]# export PATH$PWD/bin:$PATH demo专为测试准备的功能集合 [rootk8s2 istio-1.19.3]# i…

数据挖掘 关联规则分析

好久没学宋老师的数据挖掘了&#xff0c;今天补一下 ###第一题 import pandas as pd from mlxtend.preprocessing import TransactionEncoder from mlxtend.frequent_patterns import apriori, association_rules# 文件中没有列名 文件中的数据…

Ubuntu安装Python环境(使用VSCode)

想在Ubuntu上安装Python环境&#xff0c;选择了VSCode&#xff0c;而不想多装Anaconda等环境&#xff0c;最后参考了这篇博客&#xff1a; python入门开发:ubuntu下搭建python开发环境(vscode)

Linux文件系统之inode

文章目录 1. 磁盘1.1 认识磁盘1.2 磁盘物理构造1.3 磁盘逻辑结构 2. 文件系统3. 如何理解目录 1. 磁盘 1.1 认识磁盘 文件 内容 属性&#xff0c;而文件是存储在磁盘上&#xff0c;那么可以理解为磁盘上存储的文件 存储的文件内容 存储的文件属性。 文件的内容采用的是块式…