slf4j+logback源码加载流程解析

slf4j绑定logback源码解析

Logger log = LoggerFactory.getLogger(LogbackDemo.class);

如上述代码所示,在项目中通常会这样创建一个Logger对象去打印日志。
然后点进去,会走到LoggerFactory的getILoggerFactory()方法,如下代码所示。

	public static ILoggerFactory getILoggerFactory() {if (INITIALIZATION_STATE == UNINITIALIZED) {synchronized (LoggerFactory.class) {if (INITIALIZATION_STATE == UNINITIALIZED) {INITIALIZATION_STATE = ONGOING_INITIALIZATION;performInitialization();}}}switch (INITIALIZATION_STATE) {case SUCCESSFUL_INITIALIZATION:return StaticLoggerBinder.getSingleton().getLoggerFactory();case NOP_FALLBACK_INITIALIZATION:return NOP_FALLBACK_FACTORY;case FAILED_INITIALIZATION:throw new IllegalStateException(UNSUCCESSFUL_INIT_MSG);case ONGOING_INITIALIZATION:// support re-entrant behavior.// See also http://jira.qos.ch/browse/SLF4J-97return SUBST_FACTORY;}throw new IllegalStateException("Unreachable code");}

performInitialization()方法表示执行初始化,点进去会调用到LoggerFactory的bind()方法,如下代码所示。

			Set<URL> staticLoggerBinderPathSet = null;if (!isAndroid()) {// 查找org/slf4j/impl/StaticLoggerBinder.class这个类的路径staticLoggerBinderPathSet = findPossibleStaticLoggerBinderPathSet();// 如果有多个则打印Class path contains multiple SLF4J bindingsreportMultipleBindingAmbiguity(staticLoggerBinderPathSet);}// StaticLoggerBinder类是各个日志框架提供的,比如logback,如下图所示StaticLoggerBinder.getSingleton();INITIALIZATION_STATE = SUCCESSFUL_INITIALIZATION;reportActualBinding(staticLoggerBinderPathSet);fixSubstituteLoggers();replayEvents();// release all resources in SUBST_FACTORYSUBST_FACTORY.clear();

在这里插入图片描述
StaticLoggerBinder类加载时会执行初始化,如下代码所示。

	static {SINGLETON.init();}void init() {try {try {// 这里会完成logback的自动配置new ContextInitializer(defaultLoggerContext).autoConfig();} catch (JoranException je) {Util.report("Failed to auto configure default logger context", je);}// logback-292if (!StatusUtil.contextHasStatusListener(defaultLoggerContext)) {StatusPrinter.printInCaseOfErrorsOrWarnings(defaultLoggerContext);}contextSelectorBinder.init(defaultLoggerContext, KEY);initialized = true;} catch (Exception t) { // see LOGBACK-1159Util.report("Failed to instantiate [" + LoggerContext.class.getName() + "]", t);}}

logback源码解析

ContextInitializer.autoConfig()方法源码如下:

    public void autoConfig() throws JoranException {StatusListenerConfigHelper.installIfAsked(loggerContext);// 查找配置文件,优先级:系统属性logback.configurationFile > logback-test.xml > logback.xmlURL url = findURLOfDefaultConfigurationFile(true);if (url != null) {configureByResource(url);} else {// 使用java的spi机制,查找Configurator的实现,如果有,则自动配置logbackConfigurator c = EnvUtil.loadFromServiceLoader(Configurator.class);if (c != null) {try {c.setContext(loggerContext);c.configure(loggerContext);} catch (Exception e) {throw new LogbackException(String.format("Failed to initialize Configurator: %s using ServiceLoader", c != null ? c.getClass().getCanonicalName() : "null"), e);}} else {// 使用默认的BasicConfigurator来自动配置logbackBasicConfigurator basicConfigurator = new BasicConfigurator();basicConfigurator.setContext(loggerContext);basicConfigurator.configure(loggerContext);}}}

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

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

相关文章

Maven介绍安装和配置详解

点击下载《Maven介绍安装和配置详解》 1. Maven介绍 Maven是一个自动化构建工具&#xff0c;主要用于Java项目的构建和管理。它使用一种基于项目对象模型&#xff08;POM&#xff09;的概念&#xff0c;使得开发者能够使用一种统一的方式来管理项目的构建、报告和文档。 以下…

大模型提效105篇必读论文和代码汇总,涵盖预训练、注意力、微调等7个方向

大型语言模型&#xff08;LLMs&#xff09;在NLP领域中具有显著的优势&#xff0c;它们在语言理解和生成方面表现出了强大的能力&#xff0c;甚至可以进行复杂的推理任务。这些能力能让大模型在许多领域都有广泛的应用前景&#xff0c;比如文本生成、对话系统、机器翻译、情感分…

【WinForm.NET开发】如何验证用户输入

本文内容 MaskedTextBox 控件事件驱动的验证隐式和显式验证关闭窗体和重写验证 用户在应用程序中输入数据后&#xff0c;建议在应用程序使用数据之前验证数据是否有效。 可以要求某些文本字段的长度不能为零&#xff0c;字段应设置为电话号码格式&#xff0c;或者字符串中不得…

论文阅读——EfficientViT(cvpr2023)

EfficientViT: Memory Efficient Vision Transformer with Cascaded Group Attention 1、 从三个角度探讨如何提高vision transformers的效率&#xff1a;内存访问、计算冗余和参数使用。 2.1. Memory Efficiency 红色字体表示操作所花费的时间主要由内存访问决定&#xff0c;…

C语言 linux文件操作(一)

文章目录 一、linux文件权限1.1文件描述符1.2文件描述符的范围和默认值1.3打开文件和文件描述符1.4标准文件描述符1.5文件描述符的重定向和关闭1.6I/O 操作1.7使用文件描述符进行进程通信1.8资源限制 二、C语言文件读写2.1open 函数2.2 flags参数详解2.3 lseek 函数 一、linux文…

c# 并行处理

以下是一个使用 C# 并行处理来读取大量小文件的例子&#xff0c;这个例子中我们使用 Parallel.ForEach 方法并结合 File.ReadAllLines 来提高读取速度&#xff1a; using System; using System.Collections.Concurrent; using System.IO; using System.Linq;class Program {st…

Javaweb之数据库连接池以及lombok类库的详细解析

3. 数据库连接池 在前面我们所讲解的mybatis中&#xff0c;使用了数据库连接池技术&#xff0c;避免频繁的创建连接、销毁连接而带来的资源浪费。 下面我们就具体的了解下数据库连接池。 3.1 介绍 没有使用数据库连接池&#xff1a; 客户端执行SQL语句&#xff1a;要先创建一…

JS + CSS 实现高亮关键词(不侵入DOM)

之前在做关键词检索高亮功能的时候&#xff0c;研究了下目前前端实现高亮的几种方式&#xff0c;第一就是替换dom元素实现高亮&#xff0c;第二就是利用浏览器新特性Css.highlights结合js选区与光标与CSS高亮伪类实现&#xff0c;实现功能如下&#xff1a; 一、页面布局 一个…

2023春季李宏毅机器学习笔记 02 :机器学习基本概念

资料 课程主页&#xff1a;https://speech.ee.ntu.edu.tw/~hylee/ml/2023-spring.phpGithub&#xff1a;https://github.com/Fafa-DL/Lhy_Machine_LearningB站课程&#xff1a;https://space.bilibili.com/253734135/channel/collectiondetail?sid2014800 一、機器學習基本原理…

Resource Autowire

Resource注入 Java自带的注解&#xff0c;javax.annotation.resource,Spring支持该注解默认按照byName注入方式&#xff0c;通过反射机制自动注入的策略装配策略&#xff1a; ①如果同时指定了name和type&#xff0c;则从Spring上下文中找到唯一匹配的bean进行装配&#xff0c…

位乘积计数-蓝桥

题目链接&#xff1a;1.位乘积计数 - 蓝桥云课 (lanqiao.cn) 解题思路&#xff1a;10的5次数量级暴力居然过了&#xff0c;看来测试样例很水&#xff0c;直接1遍历到n&#xff0c;再用一个循环判断每位数相乘乘机是否等于m即可。 下面是c代码&#xff1a; #include <iost…

叫板GPT-4的Gemini,我做了一个聊天网页,可图片输入,附教程

先看效果&#xff1a; 简介 Gemini 是谷歌研发的最新一代大语言模型&#xff0c;目前有三个版本&#xff0c;被称为中杯、大杯、超大杯&#xff0c;Gemini Ultra 号称可与GPT-4一较高低&#xff1a; Gemini Nano(预览访问) 为设备端体验而构建的最高效模型,支持离线使用场景。…

什么是数据结构?

1、一种非常经典的数据结构。 栈数据结构&#xff1a;stack 2、什么是数据结构&#xff1f; 数据结构通常是&#xff1a;存储数据的容器。而该容器可能存在不同的结构。 数据结构和 java 语言实际上是没有关系&#xff0c;数据结构是一门独立的学科。 在大学计算机专业中&#…

[Redis实战]分布式锁

四、分布式锁 4.1 基本原理和实现方式对比 分布式锁&#xff1a;满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁&#xff0c;只要大家使用的是同一把锁&#xff0c;那么我们就能锁住线程&#xff0c;不让线程进行&#xf…

Rust赋值语句和数字类型

赋值语句 在Rust中&#xff0c;使用let关键字定义变量。格式是let 变量名:变量类型 变量值;&#xff0c;下边是个例子&#xff1a; let age:i32 18;这就是定义一个有符号32位的数字变量age&#xff0c;而其中的值是18。 而在C语言定义变量的语句格式是类型 变量名 变量值。…

【网络技术】【Kali Linux】Wireshark嗅探(三)用户数据报(UDP)协议

一、实验目的 本次实验使用wireshark流量分析工具进行网络嗅探&#xff0c;旨在了解UDP协议的报文格式。 二、网络环境设置 本次实验使用Kali Linux虚拟机完成&#xff0c;主机操作系统为Windows 11&#xff0c;虚拟化平台选择Oracle VM VirtualBox&#xff0c;组网模式选择…

我与VR的再拜之交

我接触VR比较早。 记得早在2001年左右&#xff0c;瑞典的一家公司&#xff0c;借与上海市政府互访之际&#xff0c;提出与上海市政府在虚拟现实领域的合作。后来上海市政府邀请了上海的几家大型国企&#xff0c;包括汽车、船舶、飞机等&#xff0c;去讨论此事&#xff0c;我作…

electron使用webview出现空白页面解决办法

在使用webview标签的时候&#xff0c;出现了空白页面的情况&#xff0c;刚开始以为没有生效&#xff0c;后来发现页面上是有这个标签的&#xff0c;但是没有展示出内容&#xff0c;后来看了官网&#xff0c;默认情况下&#xff0c;webview标签在 Electron > 5 中被禁用。 &l…

pytorch机器学习各种激活函数总结(不完整学习更新中~)

pytorch各种激活函数总结 0.思维导图预览1. ReLU函数2. Sigmoid函数3. Softmax函数4. Tanh函数5.&#xff08;学习后更新&#xff09; 0.思维导图预览 1. ReLU函数 ReLU&#xff08;Rectified Linear Unit&#xff09;线性整流函数 其公式为&#xff1a; f ( x ) M a x ( 0 …

[python] 基于Dataset库操作数据库

dataset库是Python中一个用于操作数据库的简单库&#xff0c;它提供了一种简洁的方式与各种关系型数据库进行交互&#xff0c;例如SQLite、MySQL、PostgreSQL 等。你可以使用dataset库来执行查询、插入、更新和删除操作&#xff0c;而无需编写复杂的SQL语句。dataset库适用于小…