容器是什么?数据结构
水壶是容器,水壶中存放着水,等咱们须要水了,直接用.net
Spring中的ApplicationContext是容器,里面存放着各类Bean,等咱们须要了直接用,而且能够建立管理Beancode
Hierarchy是Log4j的容器,它里面存放着各类Logger? 用来管理各类Logger?blog
Hierarchy是什么?继承
从字面上看:ci
n. 层级;等级制度。文档
log4j的文档说明:get
This class is specialized in retrieving loggers by name and also maintaining the logger hierarchyio
用来根据名称获取Logger并维持logger等级。看来是咱们想一想的那样,存放着各类Logger并管理,等咱们须要的时候还能够从中获取。class
Hierarchy既然是容器,谈到容器,就如上面所说的水壶、Spring中的ApplicationContext以及Java中的集合类。他们的核心功能就是存和取。
简单认识下Hierarchy字段
容器存的是Logger,每一个Logger都有全局惟一的名称,也能够说每一个名称只对应一个Logger实例,全部Logger均以名称为key存储在HashTable中,而且还根据名称组装成以RootLogger为根的一棵树,树的层次由Logger的name决定,以"."分隔。以下图所示,HashTable和Logger中的parent维护了以RootLogger为根节点的树。
因为Log4j容许先存放子节点,而后再存放父节点,这里就会涉及到子节点的父节点更细问题,下面会分先存放父节点和子节点两种状况进行分析,在开始以前先来认识下ProvisionNode.
ProvisionNode:
Provision类实际上就是一个Vector(经过继承Vector实现)。当ChildLogger先创建,未能找到parent的时候,log4j会预先创建一个ProvisionNode,并将ChildLogger添加到ProvisionNode中,当实际的ParentLogger建立时,再将全部的ChildLogger从ProvisionNode转移到Parent中.
再存放Logger(x.y.z),在HashTable中没有找到对应的Logger,调用LoggerFactory获得Logger(x.y.z);x.y.z的parent有x.y、x、root,在HashTable中能找到x.y对应的Logger,设置Logger(x.y.z)的parent为Logger(x.y)
依次类推...
存放Logger(x.y.z)
查询HashTable中不存在,Logger(x.y.z),建立Logger(x.y.z)
遍历父节点x.y/x,不存在Logger(x.y)和Logger(x),建立P(x.y)和P(x),并添加Logger(x.y.z)到vector容器中,并存储在HashTable中
没有找到父节点对应的Logger,设置Root为父节点
存放Logger(x.y)
查询HashTable,获得P(x.y),建立Logger(x.y)
遍历P(x.y)的Vector(存放子节点)更新其parent
遍历Logger(x.y)父节点x,不存在Logger(x),则把Logger(x,y)添加到P(x)对应的vector中
没有找到Logger(x.y)父节点对应的Logger,设置RootLogger为其父节点
存放Logger(x)
以此类推...
从上面的案例能够看出相同的名称获得的Logger实例必定是相同,并且每一个Logger都有一个Parent,根节点是RootLogger。
咱们经常用下面的代码得到Logger,相信经过上面的讲解,你已经知道怎么获取的了。其实就是根据Class的彻底限定名,去HashTable中获取,若是不存在则建立,而后更新parent以及child.
private static Logger logger = Logger.getLogger(Test.Class);
参考