log4j 源码解析_Log4j2源码分析系列:(一)配置加载

本文主要探讨log4j2的配置加载过程,从日志框架的重要性出发,详细解析了配置文件的类型、加载逻辑以及在不同环境下的应用。通过源码分析,解答了为什么需要配置文件、配置文件命名规则以及加载方式等问题,旨在帮助读者深入理解log4j2的工作原理。
摘要由CSDN通过智能技术生成

前言

在实际开发项目中,日志永远是一个绕不开的话题。本系列文章试图以slf4j和log4j2日志体系为例,从源码角度分析日志工作原理。

置加载过程为主线,描述其工作流程;影响不大的旁枝细节会忽略,有兴趣的读者可自行查阅源码。2.多图预警!用电脑查看效果更佳。3.尽量动手操作,以加深理解。 环境准备阅读源码前,请确保引入了sl

学习日志框架,首先要熟悉各类日志框架,这里推荐两篇文章,就不再赘述了。

我们会拿到一个AppClassLoader,LogManager会利用这个类加载器获取上下文。进入getContext看看:请注意:这里的factory是Log4jContextFactory,它是在

对于log4j2,配置文件有几类:properties、xml、json/jsn以及yaml/yml,平常我们用xml居多。

Factory:接下来,我们进入log4j2的getLogger环节。可以看到getLogger是个接口方法,并且有3个实现。还记得我们刚才获取到的Log4jLoggerFactory吗?Abstra

一般情况下,我们会创建log4j2.xml放到项目的/resources文件夹下。大部分使用maven管理依赖的项目也可能分环境配置,不同环境读取不同的log4j2文件,这时它一般在/profiles/${env}/文件夹下。

怎么初始化的?其实,在调用LogManager.getContext(cl,false);之前,LoggerManager中的静态代码块会提前被调用,我们看一下: 我们看89~100行代码即

大多数人,应该是“借鉴”其他项目,把配置复制过来,再修修补补。然而你是否思考过:

eAttr,intdefStyleRes)这个构造方法对比构造方法三就多了一个参数defStyleRes这个参数的作用就是再提供一个给View提供默认属性的手段。defStyleRes就是把一些我们想

为什么要写这个配置文件?不写的话会出什么问题?

这个配置文件的命名有什么规定吗?为什么我们平时见到的都是log4j2.xml,而不是其他名字?

这个配置文件是如何被加载的?

回答以上问题,就是本文的初衷。

度分析日志工作原理。学习日志框架,首先要熟悉各类日志框架,这里推荐两篇文章,就不再赘述了。https://www.cnblogs.com/rjzheng/p/10042911.htmlhttps://

提示

1. 本文会用调试的方法,以log4j2配置加载过程为主线,描述其工作流程;影响不大的旁枝细节会忽略,有兴趣的读者可自行查阅源码。

这里使用饿汉方式实现了单例。41行实例化StaticLoggerBinder,会跳到53行,我们进去看看细节。可以看出Log4jLoggerFactory继承了AbstractLoggerAdapte

2. 多图预警!用电脑查看效果更佳。

法内部: 现在,url已经获取到了。它的值是"项目路径/target/classes/log4j2.xml"。后面的事情就是从文件加载内容(517行,涉及到类加载器的知识,请自行查看)。再然

3. 尽量动手操作,以加深理解。

个Button类在调用这个构造函数的时候会给defStyleAttr赋予一个默认的值R.attr.buttonStyle这个值包含了Button的一些基本的风格(会在Theme中给出),比如:最小宽度

2.7

artifactId>2.7

明,可自行查看。接下来,进入getConfiguration方法:进入该方法:请注意,这里的getFactories已经很明显地告诉我们,这里有4个工厂(均继承自ConfigurationFactor

对应的生成xml中定义的View的时候调用的。剩下的两个构造方法,大家了解的就比较少了。一般在自定义View的时候都会不加思索的按照固定的写法。那么你有没有想探究一下里面的关系呢?构造方法View(C

/profiles/${env}/文件夹下。大多数人,应该是“借鉴”其他项目,把配置复制过来,再修修补补。然而你是否思考过:为什么要写这个配置文件?不写的话会出什么问题?这个配

用方式见上面button,主题中设置不同的类型,View的默认风格会发生改变。通过defStyleRes设置属性这种方式是直接在代码中指定一个默认的style,和Context的主题没有关系在Them

环境准备

阅读源码前,请确保引入了slf4j和log4j2依赖包,以及适配包。以maven为例,本文示例程序引入了:

建一个java文件,打断点开始调试。进入getLogger方法。可以看到,在LoggerFactory获取具体的Logger工厂。进入getILoggerFactory方法。这里的一堆逻辑先不要管,我

org.slf4j

slf4j-api

1.7.21

org.apache.logging.log4j

log4j-slf4j-impl

2.7

org.apache.logging.log4j

log4j-core

2.7

org.apache.logging.log4j

log4j-api

2.7

源码

首先,我们新建一个java文件,打断点开始调试。

条件拼接处配置文件的名字。 以最常见的log4j2.xml为例:上图中,我们已经得到了配置文件的名字:log4j2.xml。同时可以看到,prefix为log4j2,suffix为文件后缀。

进入getLogger方法。可以看到,在LoggerFactory获取具体的Logger工厂。

l中使用CustomTextView第三步:运行程序,查看结果可以看到xml中定义的5个属性全部打印出来。因此AttributeSet对应的就是xml布局文件中定义的属性给View提供样式的方式直接通

进入getILoggerFactory方法。

行:这里尝试用不同的条件获取config,如果最终config为null,就会打印error日志,告诉你没有找到配置文件。由于目前我们还没有配置,就会走到466行。 现在,你可以在/reso

这里的一堆逻辑先不要管,我们最终会进入418行。

符合规范!构造方法View(Contextcont

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值