Java日志体系概述

embedded/2024/10/19 1:29:15/

一. 日志体系分类

1.1 功能分类

1.2 jar包分类

二. 以log4j2为例

2.1 slf4j-api的初始化动态绑定过程

一. 日志体系分类

1.1 功能分类

  • 门面类
    • slf4j:Simple Logging Facade for Java,为java提供的简单日志Facade
  • 具体实现类
    • logback
    • log4j1
    • log4j2
    • jul:Java.Util.Logging
    • simple
    • nop
    • jcl:Jekarta Commons Logging

1.2 jar包分类

类别

jar包名

说明

门面类

slf4j-api

slf4j的门面

适配器类

log4j-1.2-api

log4j1—>log4j2

log4j-jcl

commons-logging到log4j的桥梁

jcl-over-slf4j

commons-logging 到slf4j的桥梁

slf4j-jdk14

slf4j到jdklog的桥梁,Jdk原生日志框架

slf4j-jcl

slf4j到commons-logging的桥梁

logback-slf4j

slf4j到logback的桥梁

 jul-to-slf4j

jul-java.util.logging到slf4j的桥梁

jcl-over-slf4j

commons-logging 到slf4j的桥梁

log4j-over-slf4j

log4j到slf4j的桥梁

slf4j-log4j12

slf4j到log4j1的桥梁

log4j-slf4j-impl

slf4j到log4j2的桥梁

实现类(以log4j2为例)

log4j-api、log4j-core

log4j2日志的核心实现包

  • Log4j-api是向外提供的接口层

  • log4j-core是具体实现层

二. 以log4j2为例

  • 通常,代码里都会通过 LoggerFactory.getLogger 来获取 Logger,该 Logger 来自于 slf4j-api 的类
    • slf4j-api这个jar包中,除了 LoggerFactory 这个类实现了动态初始化绑定的逻辑,剩下基本都是接口,用于给适配器实现

2.1 slf4j-api的初始化动态绑定过程

该初始化逻辑全部在 org.slf4j.LoggerFactory 中,入口为 performInitialization() ——> bind(),bind()方法中有三个主要逻辑

  • findPossibleStaticLoggerBinderPathSet():找到类加载器下 StaticLoggerBinder 的所有子类
  • reportMultipleBindingAmbiguity:如果找到多个实现类,打个日志
  • StaticLoggerBinder.getSingleton():随机选取一个StaticLoggerBinder.class来创建一个单例

  • findPossibleStaticLoggerBinderPathSet():
    • 获取LoggerFactory的类加载器:AppClassLoader
    • 在该类加载器下,寻找 "org/slf4j/impl/StaticLoggerBinder.class" 的实现类,即适配器类,见下图1
    • 见下图2,可以看到项目里找到了两个 StaticLoggerBinder 的实现类,一个是log4j1的,一个是log4j2的

  • reportMultipleBindingAmbiguity()
    • 如果找到多个匹配的,打日志

  • ​StaticLoggerBinder.getSingleton()
    • 随机选取一个
  • reportActualBinding(staticLoggerBinderPathSet)
    • 打印出真实绑定的


http://www.ppmy.cn/embedded/43688.html

相关文章

软件功能测试的类型和流程分享

在现代社会,软件已经成为人们生活中不可或缺的一部分,而在软件的开发过程中,功能测试是不可或缺的环节。软件功能测试指的是对软件系统的功能进行检查和验证,以确保软件在各种情况下能够正常运行,并且能够按照用户需求…

视图【mysql数据库】

目录 一、视图的创建、查看、修改、删除 二、cascaded、local检查选项 cascaded和local的区别 三、视图的更新 四、视图的作用 一、视图的创建、查看、修改、删除 二、cascaded、local检查选项 上面的几句SQL中,我们虽然给视图插入了id 30的数据,但…

华为WLAN无线组网技术与解决方案

WLAN无线组网技术与解决方案 网络拓扑采用AP和AC旁挂式无线组网 配置思路: 1.让AP上线 1.1,使得AP能够获得IP地址 配置步骤: 1.把AC当作一个一个有管理功能的三层交换机 sys Enter system view, return user view with CtrlZ. [AC6605]vlan …

C++候捷stl-视频笔记1

认识headers、版本、重要资源 STL的核心思想是泛型编程 新式头文件内的组件封装在命名空间std中: using namespace std; using std::cout;或std::vector vec; 旧式头文件内的组件不封装在命名空间std中 注:不建直接使用using namespace xxx,如果使用的…

vue中在mounted使用$refs获取不到DOM元素

vue中在mounted使用$refs获取不到DOM元素 前言解决方案1、通过使用$nextTick来获取2、updated中获取 前言 在使用ref的时候,在mounted中通过$ref获取节点是获取不到报undefined this.$refs.xx 为 undefined 解决方案 在mounted钩子中加载回来的数据不会在这个阶段更…

Flask初体验

这里有一份展示Flask与Python的协同代码,Flask的web页面展示了系统的一个暴露的公共tcp port连接的所有用户ip:port列表。 做完才发现没有什么用处,我的本意是做一个reverse的ssh或者telnet终端。看点有几个: 我原本是打算用multiprocessin…

智能家居3 - 实现烟雾报警模块

这一模块的思路和前面的语言控制模块很相似&#xff0c;差别只是调用TCP 去控制 废话少说&#xff0c;放码过来 增添/修改代码 smoke_interface.c #include <pthread.h> #include <wiringPi.h> #include <stdio.h>#include "smoke_interface.h" …

Git Core Lecture

1、Git 简介 官方介绍&#xff1a;Git is a fast distributed revision control system (Git 是一个快速的分布式版本控制系统) 2、Git Core Command 2.1 git init git 工程初始化&#xff0c;会在工作区 (working directory) 根目录中创建.git 目录 # 创建目录 $ mkdir git-i…