对于log4j2,配置文件有几类:properties、xml、json/jsn以及yaml/yml,平常我们用xml居多。
一般情况下,我们会创建log4j2.xml放到项目的/resources文件夹下。大部分使用maven管理依赖的项目也可能分环境配置,不同环境读取不同的log4j2文件,这时它一般在/profiles/${env}/文件夹下。
大多数人,应该是“借鉴”其他项目,把配置复制过来,再修修补补。然而你是否思考过:
- 为什么要写这个配置文件?不写的话会出什么问题?
- 这个配置文件的命名有什么规定吗?为什么我们平时见到的都是log4j2.xml,而不是其他名字?
- 这个配置文件是如何被加载的?
回答以上问题,就是本文的初衷。
提示
1. 本文会用调试的方法,以log4j2配置加载过程为主线,描述其工作流程;影响不大的旁枝细节会忽略,有兴趣的读者可自行查阅源码。
2. 多图预警!用电脑查看效果更佳。
3. 尽量动手操作,以加深理解。
环境准备
阅读源码前,请确保引入了slf4j和log4j2依赖包,以及适配包。以maven为例,本文示例程序引入了:
<!-- slf4j --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.21</version> </dependency> <!-- bridge --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.7</version> </dependency> <!-- log4j2 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.7</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.7</version> </dependency>
源码
首先,我们新建一个java文件,打断点开始调试。
进入getLogger方法。可以看到,在LoggerFactory获取具体的Logger工厂。
进入getILoggerFactory方法。
这里的一堆逻辑先不要管,我们最终会进入418行。
接下来进入真正的日志绑定环节。由于我们只引入了log4j2,这里会直接找到它,继而绑定。StaticLoggerBinder就在log4j2的包中。
程序走到61行,可以看到这里使用饿汉方式实现了单例。41行实例化StaticLoggerBinder,会跳到53行,我们进去看看细节。