Java日志体系概述

一. 日志体系分类

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.mzph.cn/pingmian/18707.shtml

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

相关文章

Windows下切换不同版本的CUDA

在环境变量处将需要使用的CUDA版本的如图所框选的环境变量移到其他版本环境变量的前方即可 PS:改环境变量后重启命令行再查看版本~

Three.js是基于原生WebGL封装的三维引擎

Three.js: 基于原生WebGL封装的三维引擎 引言 随着互联网技术的发展,Web前端技术不断进步,用户对于网页交互体验的要求也越来越高。艾斯视觉前端开发:三维技术作为提升用户体验的重要手段之一,正在逐渐成为前端开发中的热门技术…

pdf只要其中一页 pdf只要第一页怎么办 pdf只要前几页怎么弄

在现代办公环境中,PDF文件已经成为我们日常工作中不可或缺的一部分。然而,有时我们可能只需要PDF文件中的某一页,而不是整个文件。这时,我们该如何操作才能只获取所需的那一页呢?本文将详细操作方法,帮助大…

Spark中的累加器与广播变量及blockmanager图解

一、累加器 1、累加器的引入 案例:没读取一条文件中的数据,count1,并打印在Drive端(控制台) import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.rdd.RDDobject Demo20Accumulator {def ma…

应用弹窗优先级

背景 由于活动业务越来越多,积累的弹窗越来越多和杂乱,出现如下弹窗交互问题: 弹窗无限重叠,影响操作 弹出顺序无优先级,重要弹窗被隐藏 原因相信大家都一样,产品是一次次迭代的,也可能是不同人开发的,两个毫不相关的业务,弹窗时机也没有任何关联,重不重叠我怎么控制…

有效运营企业内部社区的板块有哪些?

随着企业内部沟通和协作的重要性日益凸显,建立一个高效运营的企业内部社区成为越来越多企业的首要任务。针对不同的需求和目标,将企业内部社区分为多个板块,可以更好地促进员工之间的沟通、协作和共享知识。下面介绍如何从分多个板块创建的角…

训练模型为什么数据量大了效果却越来越差了

在使用卷积神经网络(CNN)训练识别模型时,如果随着数据量的增加,模型的效果却越来越差,可能涉及多个因素。以下是一些可能导致这种情况的原因: 数据质量问题:虽然数据量增加了,但如果…

SQL注入攻击是什么?如何预防?

一、SQL注入攻击是什么? SQL注入攻击是一种利用Web应用程序中的安全漏洞,将恶意的SQL代码插入到数据库查询中的攻击方式。攻击者通过在Web应用程序的输入字段中插入恶意的SQL代码,然后在后台的数据库服务器上解析执行这些代码,从而…

定个小目标之每天刷LeetCode热题(3)

这是一道简单题&#xff0c;我这里就只讲两种解法 第一种是数组加双指针&#xff0c;先遍历链表将值存到数组里&#xff0c;然后分别从数组两端进行一一比较判断是否满足回文&#xff0c;代码实现 class Solution {public boolean isPalindrome(ListNode head) {List<Inte…

给想玩AIGC的小白:教你从0搭一个图文视频生成网站(附插件源码)

Stable Diffusion的发布是AI图像生成发展过程中的一个里程碑&#xff0c;相当于给大众提供了一个可用的高性能模型&#xff0c;让「AI 文本图片生成」变成普通人也能玩转的技术。最近一些网友将网上的真人图片不断喂给模型&#xff0c;让其自主学习&#xff0c;训练出来的效果已…

工业工程师日子越来越受不了?IE们都在做什么?

有一位工业工程师&#xff08;IE&#xff09;毕业在一家工厂工作&#xff0c;入职一年了&#xff0c;本科读的是工业工程&#xff0c;他说理想很美好现实很骨感&#xff0c;以为做和本科一样的职业就能够大展宏图&#xff0c;结果上司天天让他盯生产线&#xff0c;在厂房一站就…

量产导入 | 一文理解芯片可靠性测试项目

可靠性试验,是指通过试验测定和验证产品的可靠性。 研究在有限的样本、时间和使用费用下,找出产品薄弱环节。 可靠性试验是为了解、评价、分析和提高产品的可靠性而进行的各种试验的总称。 为了测定、验证或提高产品可靠性而进行的试验称为可靠性试验,它是产品可靠性工作…

基于jeecgboot-vue3的Flowable增加表单功能(三)

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 接上一节 10、新建表单&#xff0c;打开VForm3编辑页面 /*** 新增事件*/function handleAdd() {designer.open true;nextTick(() > {reset();vfDesignerRef.value.clearDesigner();}…

Idea可以运行Python!

Idea可以运行Python&#xff01; 以下这篇文章为基础教程&#xff1a; idea编写运行python_idea创建python项目-CSDN博客

m1系列芯片aarch64架构使用docker-compose安装nacos

之前看到 DockerHub 上发布了 m1 芯片 aarch64 架构的 nacos 镜像, 所以就尝试的安装了下, 亲测可用: 一. docker-compose.yml 编写 请确保自己的 mysql 服务已经启动了, 并且允许远程连接 volumes 挂载目录需要换成自己的目录 二. 容器运行和网络组 2.1 查看容器运行情况 …

蓝牙模块怎么使用?一篇全面指南!

一、引言   在这个数字化时代&#xff0c;蓝牙模块已经渗透到了我们日常生活的方方面面。它为各种设备提供了无线连接的可能性&#xff0c;极大地增强了我们的便利性和效率。那么&#xff0c;蓝牙模块怎么使用呢&#xff1f;本文将为你提供一份详细指南。   二、基础知识  …

【ai】livekit服务本地开发模式及example app信令交互详细流程

文档要安装git lfs 下载当前最新版本1.6.1 windows版本&#xff1a;启动dev模式 服务器启动 (.venv) PS D:\XTRANS\pythonProject\LIVEKIT> cd .\livekit_release\ (.venv) PS D:\XTRANS\pythonProject\LIVEKIT\livekit_release> lsDirectory: D:\XTRANS\pythonProject\L…

css-表头筛选的特定样式

背景 饿了么的表头筛选样式比较简单&#xff0c;如图1&#xff0c;产品觉得不够醒目&#xff08;觉得用户可能不知道这是筛选&#xff0c;我表示不理解&#xff09; 要求改进筛选的样式&#xff0c;达到图2的效果&#xff0c;主要是状态列&#xff0c;既希望这列的宽度固定&a…

[UE5]安卓调用外置摄像头拍照(之显示画面)

目录 部分参考文献&#xff08;有些有用的我没标&#xff0c;没放上来&#xff09; 要点 总蓝图 结果 部分参考文献&#xff08;有些有用的我没标&#xff0c;没放上来&#xff09; 【UE】获取USB摄像头画面_虚幻捕获硬件摄像头-CSDN博客 UE4安卓调用摄像头拍照确保打…

Python基础学习笔记(九)——字符串(下)

目录 前言一、字符串的编码、检测和比较1. 编码与解码2. 字符检测与判断3. 字符串的比较 二、占位符与格式化1. %型格式化2. {}型格式化3. 浮点格式化4. f-string 格式化4.1 对象调用4.2 数字格式4.3 字符串格式4.4 功能增强 三、字符驻留机制 前言 本篇将更深入地介绍字符串的…