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
作为默认配置文件的实现。