Log4j容器深入探究
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容器初始化探究 Log4j第一步就是初始化Logger容器Repository,这一章我们来探究Logger容器,从别从独立应用以及servlet容器下启动初始化两方面探究. 1 独立应用 ...
- Linux中以单容器部署Nginx+ASP.NET Core
引言 正如前文提到的,强烈推荐在生产环境中使用反向代理服务器转发请求到Kestrel Http服务器,本文将会实践将Nginx --->ASP.NET Core 部署架构容器化的过程. Ng ...
- Docker0网络及原理探究
个人观点:Docker网络通信在容器编排.集群部署中具有举足轻重的地位,(玩docker不懂docker0那就......玩不透哇)本篇分析Docker网络,并通过启动几个容器来探究Docker网络及 ...
- oo第四单元作业总结暨课程总结
oo第四单元作业总结暨课程总结 一.本单元作业架构设计 本单元需要构建一个UML解析器,通过对输入的UML类图/顺序图/状态图的相关信息进行解析以供查询,其中课程组已提供输入整体架构及输入解析部分,仅 ...
- 标准模板库(STL)学习探究之vector容器
标准模板库(STL)学习探究之vector容器 C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...
- iOS H5容器的一些探究(二):iOS 下的黑魔法 NSURLProtocol
来源:景铭巴巴 链接:http://www.jianshu.com/p/03ddcfe5ebd7 iOS H5 容器的一些探究(一):UIWebView 和 WKWebView 的比较和选择 一.前言 ...
- TKE 容器网络中的 ARP Overflow 问题探究及其解决之道
作者朱瑜坚,腾讯云后台开发工程师,熟悉 CNI 容器网络相关技术,负责腾讯云 TKE 的容器网络的构建和相关网络组件的开发维护工作,作为主力开发实现了 TKE 下一代容器网络方案. 1. 问题背景 1 ...
- iOS H5 容器的一些探究(一):UIWebView 和 WKWebView 的比较和选择
来源:景铭巴巴 链接:http://www.jianshu.com/p/84a6b1ac974a 一.Native开发中为什么需要H5容器 Native开发原生应用是手机操作系统厂商(目前主要是苹果的 ...
- iOS H5容器的一些探究(一):UIWebView和WKWebView的比较和选择
一.Native开发中为什么需要H5容器 Native开发原生应用是手机操作系统厂商(目前主要是苹果的iOS和google的Android)对外界提供的标准化的开发模式,他们对于native开发提供了 ...
随机推荐
- ASP.NET中使用TreeView显示文件
在ASP.NET中,TreeView的使用很普遍,把它利用上来 首先加入TreeView控件 <asp:TreeView ID="driverInfoView" runat= ...
- JSP学习笔记(三):Session和Cookie
一.JSP Session HTTP是无状态协议,这意味着每次客户端检索网页时,都要单独打开一个服务器连接,因此服务器不会记录下先前客户端请求的任何信息.有三种方法来维持客户端与服务器的会话: 1.C ...
- Win10系统开启Linux Bash命令行
Win10系统开启Linux Bash命令行 导读 在Build2016上微软为了拉拢开发者发了个大招,那就是Win10一周年更新集成原生Linux Bash命令行功能,这将允许开发者或用户在Wind ...
- C#基础视频教程5.1 如何编写简单的超级热键
我们上一节介绍了编写简单计算器,实际上也是出于实用角度(这个计算器只要你肯改,肯定能做的比微软自带的计算器好用).这一节介绍做简单的超级热键(所谓的超级热键是指自定义快捷键的功能) 超级热键的最关键一 ...
- 在github Pages上部署octopress搭建个人博客系统
原文链接:http://caiqinghua.github.io/blog/2013/08/26/deploy-octopress-to-github-pages/ 引子 上一篇博客已经说了为什么要搭 ...
- 流编辑器sed
sed与grep一样,都起源于老式的ed编辑器,因其是一个流编辑器(stream editor)而得名.与vi等编辑器不同,sed是一种非交互式编辑器(即用户不必参与编辑过程),它使用预先设定好的编辑 ...
- UNIX网络编程卷2进程间通信读书笔记(二)—管道 (1)
一.管道 管道的名称很形象,它就像是一个水管,我们从一端到水然后水从令一端流出.不同的是这里说的管道的两边都是进程.从一端往管道里写数据,其它进程可以从管道的另一端的把数据读出,从而实现了进程间通信的 ...
- Java中try catch finally的执行顺序问题
finally 语句块是在 try 或者 catch 中的 return 语句之前执行的.更加一般的说法是,finally 语句块应该是在控制转移语句之前执行,控制转移语句除了 return 外,还有 ...
- 安装Ubuntu 13.04后要做的六件事
2013-05-07 09:23 最新版本的Ubuntu已经新鲜出炉:Ubuntu 13.04,代号为Raring Ringtail.作为幕后开发Ubuntu Linux的公司,Canonica ...
- 统计时间段内周分类SQL语句
declare @datefrom as datetime,@dateto as datetime set @datefrom='2015-04-12' set @dateto='2015-08-13 ...