Log4J2源码系列(八) -NullConfuguration是什么?用来做什么的呢?

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

没有读过源码童鞋第一眼看到这个类肯定是一脸懵逼的,加上网上分析这个的类的文章基本上没有,心中更生疑惑。

创建的时机

NullConfiguration是LoggerContext的一个静态变量,在执行LoggerContext的构造方法之前执行:

private static final Configuration NULL_CONFIGURATION = new NullConfiguration();

用在哪儿?

在LoggerContext执行stop方法时,用于替代当前的配置文件,然后执行Log4J的收尾工作。
这样做的好处是可以避免在收尾工作的时候,还有应用程序打印日志而报错。关键部分代码如下:

final Configuration prev = configuration;
    configuration = NULL_CONFIGURATION;
    updateLoggers();
    //两种不同的收尾方式:超时和不带超时的方式
    if (prev instanceof LifeCycle2) {
        ((LifeCycle2) prev).stop(timeout, timeUnit);
    } else {
        prev.stop();
    }

内部构造

  • NullConfiguration的代码如下:
public class NullConfiguration extends AbstractConfiguration {

    /** * Name of this configuration. */
    public static final String NULL_NAME = "Null";

    public NullConfiguration() {
    	//执行AbstractionConfiguration的构造方法
        super(null, ConfigurationSource.NULL_SOURCE);
        //设置配置的名字
        setName(NULL_NAME);
        //获取root logger, 这个rootLogger是在AbstractionConfiguration创建的,稍微分析
        final LoggerConfig root = getRootLogger();
        //日志等级设置为关闭, 也就是说不会有任何的日志打印了
        root.setLevel(Level.OFF);
    }
}
  • 来看看父类的构造方法
private final ConcurrentMap<String, String> properties = new ConcurrentHashMap<>();
  // 这就是上面提到的rootLogger,其实就是个空壳 
  private LoggerConfig root = new LoggerConfig();

  protected AbstractConfiguration(final LoggerContext loggerContext, final ConfigurationSource configurationSource) {
  		//保存loggerContext的一个弱引用
        this.loggerContext = new WeakReference<>(loggerContext);
        this.configurationSource = Objects.requireNonNull(configurationSource, "configurationSource is null");
        //如上面的代码,初始存放的是一个空map
        componentMap.put(Configuration.CONTEXT_PROPERTIES, properties);
        //新建一个插件管理器
        pluginManager = new PluginManager(Node.CATEGORY);
        //创建一个空的根节点
        rootNode = new Node();
        //设置配置状态开启初始化
        setState(State.INITIALIZING);
    }

小结

NullConfiguration正如其名,本身就是个空壳儿的配置,作用是为了避免在配置收尾工作的时候发生不必要的错误调用。

相关文章