文章11 | 阅读 5976 | 点赞0
没有读过源码童鞋第一眼看到这个类肯定是一脸懵逼的,加上网上分析这个的类的文章基本上没有,心中更生疑惑。
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();
}
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正如其名,本身就是个空壳儿的配置,作用是为了避免在配置收尾工作的时候发生不必要的错误调用。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/sweetyi/article/details/105147571
内容来源于网络,如有侵权,请联系作者删除!