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容器深入探究的更多相关文章

  1. log4j容器初始化探究

    Log4j容器初始化探究 Log4j第一步就是初始化Logger容器Repository,这一章我们来探究Logger容器,从别从独立应用以及servlet容器下启动初始化两方面探究. 1 独立应用 ...

  2. Linux中以单容器部署Nginx+ASP.NET Core

    引言 正如前文提到的,强烈推荐在生产环境中使用反向代理服务器转发请求到Kestrel Http服务器,本文将会实践将Nginx --->ASP.NET Core 部署架构容器化的过程.   Ng ...

  3. Docker0网络及原理探究

    个人观点:Docker网络通信在容器编排.集群部署中具有举足轻重的地位,(玩docker不懂docker0那就......玩不透哇)本篇分析Docker网络,并通过启动几个容器来探究Docker网络及 ...

  4. oo第四单元作业总结暨课程总结

    oo第四单元作业总结暨课程总结 一.本单元作业架构设计 本单元需要构建一个UML解析器,通过对输入的UML类图/顺序图/状态图的相关信息进行解析以供查询,其中课程组已提供输入整体架构及输入解析部分,仅 ...

  5. 标准模板库(STL)学习探究之vector容器

    标准模板库(STL)学习探究之vector容器  C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...

  6. iOS H5容器的一些探究(二):iOS 下的黑魔法 NSURLProtocol

    来源:景铭巴巴 链接:http://www.jianshu.com/p/03ddcfe5ebd7 iOS H5 容器的一些探究(一):UIWebView 和 WKWebView 的比较和选择 一.前言 ...

  7. TKE 容器网络中的 ARP Overflow 问题探究及其解决之道

    作者朱瑜坚,腾讯云后台开发工程师,熟悉 CNI 容器网络相关技术,负责腾讯云 TKE 的容器网络的构建和相关网络组件的开发维护工作,作为主力开发实现了 TKE 下一代容器网络方案. 1. 问题背景 1 ...

  8. iOS H5 容器的一些探究(一):UIWebView 和 WKWebView 的比较和选择

    来源:景铭巴巴 链接:http://www.jianshu.com/p/84a6b1ac974a 一.Native开发中为什么需要H5容器 Native开发原生应用是手机操作系统厂商(目前主要是苹果的 ...

  9. iOS H5容器的一些探究(一):UIWebView和WKWebView的比较和选择

    一.Native开发中为什么需要H5容器 Native开发原生应用是手机操作系统厂商(目前主要是苹果的iOS和google的Android)对外界提供的标准化的开发模式,他们对于native开发提供了 ...

随机推荐

  1. go语言基础之局部变量特点

    1.局部变量特点 示例1: package main import "fmt" func main() { //定义在{}里面的变量就是局部变量,只能在{}里面有效 //执行到定义 ...

  2. 《纵向切入ASP.NET 3.5控件和组件开发技术》笔记:高效率事件集合对象

    在之前讲的几个例子中,使用的是最普通的定义事件方法,比如KingTextBox中事件是这样定义的:/// <summary>/// 获得本书更多内容,请看:/// http://blog. ...

  3. 转:Android应用开发性能优化完全分析

    转自:http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜 ...

  4. [Compose] 15. Applicative Functors for multiple arguments

    Working our way backwards from solution to problem, we define an applicative functor, then use it to ...

  5. (剑指Offer)面试题41:和为s的两个数字

    题目: 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s,如果有多对数字的和等于s,输出任意一对即可. 思路: 1.枚举 固定一个数字,然后依次判断数组中该数字后面的数字与 ...

  6. [Linux]vbox 虚拟机加入新磁盘

    情况是这种,開始创建虚拟机的时候硬盘设置太小了.仅仅有10g,我如今通过vbox的设置给这个linux(centos6.6)虚拟机加入了一块硬盘. 以下的操作就是怎么把硬盘挂载到系统中. 通过 fdi ...

  7. Cocos2d-x 3.2 Lua演示样例 AssetsManagerTest(资源管理器)

    Cocos2d-x 3.2 Lua演示样例 AssetsManagerTest(资源管理器) 本篇博客介绍Cocos2d-x 为我们提供的一个类--AssetsManager在Lua中的使用样例,效果 ...

  8. 正确用DD测试磁盘读写速度

    转自:http://blogread.cn/it/article/6479?f=wb 问: 以下几种方式测试磁盘读写速度有什么区别? dd bs=1M count=128 if=/dev/zero o ...

  9. JSP生成静态html网页

    /** * jsp生成静态html网页 */ public class ToHtml extends HttpServlet { public void service(HttpServletRequ ...

  10. [转发]MVC WebAPI get和post请求

    转自:http://www.cnblogs.com/babycool/p/3922738.html 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用J ...