Log4j容器深入探究

作者: gsonliu | 来源:发表于2016-11-15 14:28 被阅读245次

1.思考

容器是什么?

  • 水壶是容器,水壶中存放着水,等我们需要水了,直接用

  • Spring中的ApplicationContext是容器,里面存放着各种Bean,等我们需要了直接用,并且可以创建管理Bean

  • Hierarchy是Log4j的容器,它里面存放着各种Logger? 用来管理各种Logger?

Hierarchy是什么?

从字面上看:

n. 层级;等级制度。

log4j的文档说明:

This class is specialized in retrieving loggers by name and also maintaining the logger hierarchy

用来根据名称获取Logger并维持logger等级。看来是我们想想的那样,存放着各种Logger并管理,等我们需要的时候还可以从中获取。

2.Hierarchy 容器

Hierarchy既然是容器,谈到容器,就如上面所说的水壶、Spring中的ApplicationContext以及Java中的集合类。他们的核心功能就是存和取

简单认识下Hierarchy字段

2.1 存储数据结构

容器存的是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中.

2.1.1 先存放父节点,再存放子节点
  • 先存放RootLogger
  • 再存放Logger(x),在HashTable中没有找到对应的Logger;调用LoggerFactory得到Logger(x),x的parent是Root
  • 再存放Logger(x.y),在HashTable中没有找到对应的Logger;调用LoggerFactory得到Logger(x.y),x.y的parent有x、root,在HashTable中能找到x对应的Logger,设置Logger(x.y)的parent为Logger(x)
  • 再存放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)

    依次类推...

2.1.2 先存放子节点,再存放父节点
  • 先存放RootLogger
  • 存放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。

2.2 获取Logger

我们常常用下面的代码获得Logger,相信通过上面的讲解,你已经知道怎么获取的了。其实就是根据Class的完全限定名,去HashTable中获取,如果不存在则创建,然后更新parent以及child.


private static Logger logger = Logger.getLogger(Test.Class);

参考

[1]http://blog.csdn.net/u011794238/article/details/50742658

[2]http://blog.csdn.net/wanglz666/article/details/43195149

相关文章

  • Log4j容器初始化探究

    Log4j容器初始化探究 Log4j第一步就是初始化Logger容器Repository,这一章我们来探究Logg...

  • Log4j容器深入探究

    1.思考 容器是什么? 水壶是容器,水壶中存放着水,等我们需要水了,直接用 Spring中的Application...

  • Java编程思想(十四)

    第17章 容器深入探究 之前我们在第11章里面介绍过容器,分两类,Collection&Map,其中 Colle...

  • Docker网络模型以及容器通信

    本篇接着上篇:【Docker0网络及原理探究】,继续深入探究容器网络通信原理,通过学习Docker网路驱动模型,更...

  • 深入理解深浅拷贝

    再次深入探究了深浅拷贝的东西。非容器类和容器类的深浅拷贝大致相似,不可变类型的copy拷贝是浅拷贝,mutable...

  • iOS-性能优化深入探究

    iOS-性能优化深入探究 iOS-性能优化深入探究

  • 深入探究

    环境因素: 1.降雨量大 2.绿色植物多(空气清新) 3.保护的好 地理因素: 1.靠近赤道(热)

  • 深入探究

    成因: 1.有大量可溶性岩石存在 2.岩石具有一定的透水性(具有一定的孔隙和裂隙) 3.流水有一定的溶蚀作用 4....

  • 从源码分析log4j引起的性能问题

    坊间传闻,log4j对服务性能会造成不利影响,现从log4j的实现源码一探究竟。 一、从调用开始 打印日志时,接触...

  • 深入探究frame和bounds的区别以及setbounds使用

    深入探究frame和bounds的区别以及setbounds使用 深入探究frame和bounds的区别以及set...

网友评论

    本文标题:Log4j容器深入探究

    本文链接:https://www.haomeiwen.com/subject/imzkpttx.html