前言
在实际开发项目中,日志永远是一个绕不开的话题。本系列文章试图以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