Log4J2(五) - 配置文件是怎么获取的?

x33g5p2x  于2021-12-25 转载在 其他  
字(1.5k)|赞(0)|评价(0)|浏览(538)

简单的分类

简单的说配置文件的获取方式可以分为以下四种:

平常我们使用到的配置方式主要是local configuration,也就是配置文件放在resource中,log4j会自动查找到该文件然后解析。

整体的流程

图看上去比较复杂,我们平时在resource文件下配置的配置文件,是从[配置文件字符串是否null ==> 是]之后的流程开始的,也就是流程图的下半部分,我们来看看这部分的代码。

代码分析

private Configuration getConfiguration(final LoggerContext loggerContext, final boolean isTest, final String name) {
			//这里的name是指的context hash之后的字符串
            final boolean named = Strings.isNotEmpty(name);
            final ClassLoader loader = LoaderUtil.getThreadContextClassLoader();
            //getFactories方法获取的是ConfigurationFactory初始化的时候默认加载的用于解析配置文件的工厂类,分四种:
            //PropertyConfigruationFactory
            //JsonConfigruationFactory
            //XmlConfigruationFactory
            //YamlConfigruationFactory
            for (final ConfigurationFactory factory : getFactories()) {
                String configName;
                final String prefix = isTest ? TEST_PREFIX : DEFAULT_PREFIX;
                final String [] types = factory.getSupportedTypes();
                if (types == null) {
                    continue;
                }
				
				//每一个配置工厂可能支持多个扩展名,譬如Yaml文件就有两种:.yaml, .yml
                for (final String suffix : types) {
                    if (suffix.equals(ALL_TYPES)) {
                        continue;
                    }
                    //test,context name主要就是用在此处拼接配置文件的名字,就只是如此而已
                    configName = named ? prefix + name + suffix : prefix + suffix;
					//根据名字和当前的classloader加载配置文件
                    final ConfigurationSource source = ConfigurationSource.fromResource(configName, loader);
                    if (source != null) {
                        if (!factory.isActive()) {
                            LOGGER.warn("Found configuration file {} for inactive ConfigurationFactory {}", configName, factory.getClass().getName());
                        }
                        //调用配置工厂来解析配置文件
                        return factory.getConfiguration(loggerContext, source);
                    }
                }
            }
            return null;
        }

流程可以简单的变成下边这个这样:

小结

log4j2在读取配置文件方面比我做的工作比我想象中的要多的多~,不过仔细去看源码的话,发现这块代码写的好像不是很好,不是很容易读。

相关文章