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

Slf4j使用Logback时,Logback如何初始化

前言

Slf4j

SLF4J,全称 Simple Logging Facade for Java,是一个用于Java编程语言的日志系统抽象层。它为多种现有日志框架(例如Log4j、java.util.logging等)提供了统一的接口, 但自身并不实现日志功能。
SLF4J 允许用户在部署时选择适当的日志库(即日志框架),比如 Logback、Log4j 等。

Logback

Logback 是一个实现日志功能的库,它由Log4j的创建者设计。Logback被设计成Log4j的一个卓越替代品,它具有更好的性能、自动重加载配置文件、更丰富的日志格式以及内置日志归档等特点。
简单来说,SLF4J为Java提供了一个统一的日志接口,而Logback是一个具体的日志库,可以与SLF4J API结合起来使用。

注意,其它日志实现如log4j等结合slf4j的时候是需要桥接包,而logback是直接实现了slf4j。

Slf4j初始化源码分析

slf4j在代码中初始化一个Logger对象时,如下,调用LoggerFactory.getLogger()方法:

private final Logger logger = LoggerFactory.getLogger(this.getClass());

查看getLogger方法:

public static Logger getLogger(String name) {  
    // logback实现了slf4j的ILoggerFactory接口,关键也在于这个地方
    ILoggerFactory iLoggerFactory = getILoggerFactory();  
    return iLoggerFactory.getLogger(name);  
}

logback针对ILoggerFactory的实现类是:ch.qos.logback.classic.LoggerContext。
所以可以直接查看LoggerContext.getLogger()方法。
可以看到最终是调用到这个方法:

在这里插入图片描述

这个地方不是配方重点,这里分析下初始化的时候如何构造LoggerContext实例:

 ILoggerFactory iLoggerFactory = getILoggerFactory();  

通过追踪方法调用,可以看到最终调用的是这个bind()方法(具体调用的源码细节,可以自己点进去看一下,代码不多,不啰嗦了):

在这里插入图片描述

    private final static void bind() {
        try {
            Set<URL> staticLoggerBinderPathSet = null;
            // 不检查安卓系统的
            if (!isAndroid()) {
                 // 这里是找到所有org/slf4j/impl/StaticLoggerBinder.class的jar路径
                staticLoggerBinderPathSet = findPossibleStaticLoggerBinderPathSet();
                // 如果项目有多个日志框架的实现,平常启动项目不是会打印一些日志:Class path contains multiple SLF4J bindings.等
                // 就是这这个地方打印的,日志实现冲突
                reportMultipleBindingAmbiguity(staticLoggerBinderPathSet);
            }
            // 每个实现slf4j的日志或者桥接包都会有这个org/slf4j/impl/StaticLoggerBinder.class类
            StaticLoggerBinder.getSingleton();
            INITIALIZATION_STATE = SUCCESSFUL_INITIALIZATION;
            reportActualBinding(staticLoggerBinderPathSet);
        } catch (NoClassDefFoundError ncde) {
          // 下面代码忽略了
        } catch (java.lang.NoSuchMethodError nsme) {

        } catch (Exception e) {
            failedBinding(e);
            throw new IllegalStateException("Unexpected initialization failure", e);
        } finally {
            postBindCleanUp();
        }
    }

StaticLoggerBinder.getSingleton();这个注释里说了,每个实现或者桥接包都有这个类的,比如logback:

在这里插入图片描述

这个地方也是slf4j初始化的精髓,没有这个类就抛异常了。

而关于StaticLoggerBinder的初始化,也很平常:

在这里插入图片描述

就是通过静态代码块来初始化logback了。


http://www.kler.cn/news/148170.html

相关文章:

  • 大语言模型损失函数详解
  • 【论文阅读笔记】Smil: Multimodal learning with severely missing modality
  • paddleocr笔记
  • cocos2dx ​​Animate3D(二)
  • 【TiDB】TiDB离线方式部署
  • Ubuntu18.04安装A-Loam保姆级教程
  • BUUCTF [MRCTF2020]Ez_bypass 1
  • npm管理发布包-创建与发布
  • python:range函数的使用
  • 蓝桥杯-01简介
  • 「江鸟中原」有关HarmonyOS-ArkTS的Http通信请求
  • 获得文件MD5——校验完整性 window 和 Linux下操作
  • 2023亚太地区数学建模C题思路分析+模型+代码+论文
  • oracle 表树形结构查询递归查询
  • 学习知识回顾随笔(远程连接MySQL|远程访问Django|HTTP协议|Web框架)
  • assert
  • Nevron Vision for .NET 2023.1 Crack
  • vue脚手架的基础搭建过程
  • Android frameworks 开发总结之九(Settings)
  • electron入门(一)环境搭建,实现样例
  • Rust UI开发(四):iced中如何添加菜单栏(串口调试助手)
  • 【React】打包优化-配置CDN
  • 002、ArkTS
  • 计算机基础知识59
  • python循环
  • ESP32-Web-Server编程- JS 基础 4
  • 从赛车到服务台:IT团队可以从F1赛车中学到什么?
  • 了解JSX
  • 算法效率的度量
  • Mysql面经