slf4j常用配置文件读取
log4j2读取配置文件
日志现在一般都是使用slf4j作为接口、底层实现一般是用log4j2或者logback。
我们先看下log4j2是如何读取配置文件的。
implementation 'org.apache.logging.log4j:log4j-slf4j-impl:2.19.0'
如果使用gradle的话。上面的代码就会导入slf4j及log4j2的相关依赖。
主要是在创建完org.apache.logging.log4j.core.LoggerContext后,会调用它的start–>reconfigure,在这里面读取配置文件,转化成Configuration对象。
调用的堆栈如下图:

具体会ConfigurationFactory.getConfiguration读取配置文件
1、读取环境变量log4j.configurationFile指定的路径。
2、读取环境变量log4j.configuration指定的路径。
3、继续在下面的代码中查找配置文件

通过PropertiesConfigurationFactory、YamIConfigurationFactory、JsonConfigurationFactory、XmlConfigurationFactory
private Configuration getConfiguration(final LoggerContext loggerContext, final boolean isTest, final String name) {
final boolean named = Strings.isNotEmpty(name);
final ClassLoader loader = LoaderUtil.getThreadContextClassLoader();
//这里的getFactories()会获取配置文件处理工厂。
//分别是PropertiesConfigurationFactory、amIConfigurationFactory、sonConfigurationFactory、XmlConfigurationFactory
for (final ConfigurationFactory factory : getFactories()) {
String configName;
//处理前缀
final String prefix = isTest ? factory.getTestPrefix() : factory.getDefaultPrefix();
//处理后缀
final String [] types = factory.getSupportedTypes();
if (types == null) {
continue;
}
for (final String suffix : types) {
if (suffix.equals(ALL_TYPES)) {
continue;
}
//拼接配置文件路径
configName = named ? prefix + name + suffix : prefix + suffix;
final ConfigurationSource source = ConfigurationSource.fromResource(configName, loader);
}
}
return null;
}
在上面就会依次去拼接配置文件路径,在类路径上去查找配置文件。
这里的最后一个入参name是对应类加载器的hashcode转成16进制的字符串表示。假设这个name的值是5c29bfd。那就依次会在类路径查找如下配置文件log4j2-test5c29bfd.properties、log4j2-test5c29bfd.yml、log4j2-test5c29bfd.yaml、log4j2-test5c29bfd.json、log4j2-test5c29bfd.jsn、log4j2-test5c29bfd.xml、log4j2-test.properties、log4j2-test.yml、log4j2-test.yaml、log4j2-test.json、log4j2-test.jsn、log4j2-test.xml、log4j25c29bfd.properties、log4j25c29bfd.yml、log4j25c29bfd.yaml、log4j25c29bfd.json、log4j25c29bfd.jsn、log4j25c29bfd.xml、log4j2.properties、log4j2.yml、log4j2.yaml、log4j2.json、log4j2.jsn、log4j2.xml。
如果在环境变量中设置了
log4j2.debug=true,那么在控制台中也能看到查找配置文件的详细日志。如在代码开始位置设置了
System.setProperty("log4j2.debug","true");。就可以看到如下日志。
logback读取配置文件
implementation 'ch.qos.logback:logback-classic:1.2.11'
如果使用gradle的话。上面的代码就会导入slf4j及logback的相关依赖。
主要位置是在ch.qos.logback.classic.util.ContextInitializer.autoConfig()方法加载配置文件的。
调用堆栈如下图:

1、从环境变量logback.configurationFile指定的位置加载。
2、依次在类路径上查找logback-test.xml、logback.xml
3、用SPI的方式使用ServiceLoader.load在ch.qos.logback.classic.spi.Configurator的实现。
4、如果上面几种方式都没找到就会创建ch.qos.logback.classic.BasicConfigurator作为默认配置文件的实现。



















![〖产品思维训练白宝书 - 产品思维认知篇⑤〗- 学习 [产品思维] 需要做哪些准备?](https://img-blog.csdnimg.cn/e764f067fc174078a5a7f8d571f0d679.png#pic_center)