- 浏览: 253337 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
mabusyao:
漠北空城 写道请问下,你这个是JDK版本是多少呢?!忘记了,应 ...
HashMap 源码解读 -
漠北空城:
请问下,你这个是JDK版本是多少呢?!
HashMap 源码解读 -
schumee:
完美团队~
项目沉思录 - 1.1 -
winie:
整理下 搞成引擎嘛 国产需要这样的engine
简单工作流引擎 -
mabusyao:
某位同学给我提供的堪称完美的解决方案:1. 将三个int数组放 ...
CraneWork
最近闲来无事,正好手头上有Log4j的代码,于是就拿来学习了下。 想来这个小工具也用了很多年了,但是从来没有真正的去了解过内部机制,经过一番学习后,发现结构还是蛮不错的,里面有很多东西值得学习。
总的来说,Log4j的代码我认为可以分为这几大部分:
1. 产品Logger
2. 附件Appender
3. 仓储Repository
4. 生产工厂Factory
5. 配置管理Configuration
产品Logger
Log4j里面最重要的当然就是Logger类了,在代码中,我们通常采用LogManager.getLogger(clazz);或者Logger.getLogger(clazz) 方法来获取Logger对象。我们就来看看这里面到底有什么玄机。
下图其实是简略的版本,将一些重要的类放在其它的类图中,以突出Logger和Appender之间的关系。
Log4j初始的加载代码其实是在LogManager的静态初始块中,我会在另一篇中提到。但首先,我们先来看看LogManager.getLogger(clazz);和Logger.getLogger(clazz) 到底有什么区别:
public class Logger extends Category { static public Logger getLogger(String name) { return LogManager.getLogger(name); } ... }
可以看出,Logger本身其实并不做任何生成Logger实例的事情,而是直接代理给LogManager的静态方法。我们在代码中使用任何一种方式都是一样的。
如果仔细浏览Logger类里的代码,就会发现,Logger本身几乎不做任何事情,只有几个简单的trace方法将消息以trace的级别来记录。而我们经常使用的方法像info(), error()等,都不在Logger类里。相应的,其实他们都可以在Logger的父类Category里面找到。
按照Javadoc,Category类是deprecated and replaced by the subclass Logger,也就是说,在早期的版本中,可能用的都是Category而不是Logger类。而我们常用的一些方法,其实也还是用的是Category类里面的。
Category里面有几个很重要的变量:
volatile protected Level level; volatile protected Category parent; protected LoggerRepository repository; AppenderAttachableImpl aai;
Repository, 每个category都属于某个repository,我们会在下一个章节详细描述LoggerRepository类。
level,每一个Category(Logger)都拥有一个级别,这个级别就是我们通常所说的DEBUG,WARN,ERROR这些。这里就不再展开描述了。
parent,parent本身又是一个Category,这里就涉及到一个很重要的设计,整个Categeory是一个级联的结构,当我们对category实例执行某项log操作时,它所有的父节点也会相应的执行同样的操作:
public void info(Object message) {
if(repository.isDisabled(Level.INFO_INT)) return;
if(Level.INFO.isGreaterOrEqual(this.getEffectiveLevel()))
forcedLog(FQCN, Level.INFO, message, null);
}
protected void forcedLog(String fqcn, Priority level, Object message, Throwable t) {
callAppenders(new LoggingEvent(fqcn, this, level, message, t));
}
public void callAppenders(LoggingEvent event) {
int writes = 0;
for(Category c = this; c != null; c=c.parent) {
// Protected against simultaneous call to addAppender, removeAppender,...
synchronized(c) {
if(c.aai != null) {
writes += c.aai.appendLoopOnAppenders(event);
}
if(!c.additive) {
break;
}
}
}
if(writes == 0) {
repository.emitNoAppenderWarning(this);
}
}
从红色文字上可以看出,当Category有父亲时,将会首先调用自身的log记录信息,然后调用父亲的方法,直到继承的顶端。
下图展示了当用户调用info方法时的序列图:
从上图及代码可以发现,Category本身并没有做任何的记录log的工作,所有的这些工作都是由AppenderAttachableImpl来完成的。这个类会在下一篇文章里详细介绍。
至此,关于Logger类的内容已经大致描述,大部分时候,Logger并不做任何事情,而是将工作代理给其它类,但Logger仍然是整个Log4j里最重要的类,同时也是学习Log4j的最佳入口。
发表评论
-
大数据下的实体解析
2016-07-07 12:03 671大数据时代的实体解析困境 <!--[if !sup ... -
中文相似度匹配算法
2015-12-30 14:44 1921基于音形码的中文字 ... -
各种语言写的wordcount
2015-09-24 16:07 0Java版本: String input ... -
数组双指针算法的研究
2015-07-14 16:59 2461双指针算法在数组/链 ... -
初识ThreadLocal
2015-07-07 13:15 1516最近公司在进行Java开发人员的招聘活动,其中有一道面试题 ... -
摩尔投票法
2015-06-30 20:13 18413摩尔投票法 提问: 给定一个int型数组,找出该数 ... -
小心寄存器
2012-11-08 13:53 4试试这段代码就知道了 public cla ... -
简单工作流引擎
2012-07-06 16:58 2414从公司的一个项目中挖出来的工作流引擎的代码,虽然是一个很简单的 ... -
Always clean the ThreadLocal variables.
2012-05-24 09:16 1217Any variable stored in ThreadLo ... -
STRUTS2 源码 - Logging System
2012-05-24 08:51 1405看了STRUTS2的源码,了解了它的logging系统,觉得还 ... -
在线词典的数据结构实现。
2012-05-18 08:37 0昨天在网上看到了一道百度的面试题: Baidu写道 ... -
Log4j 代码学习 - Factory
2012-05-17 08:47 1110我们最早提到,Log4j的初始代码在LogManager的静态 ... -
Log4j 代码学习 - Appender
2012-05-16 09:09 1357在上一篇文章里,我们 ... -
java7中的ThreadLocalRandom(转)
2012-01-20 09:08 4348今天早上看到一个关于java7中的ThreadLocalRan ... -
(转)追MM与23种设计模式
2011-11-16 14:13 10001、FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德 ... -
(转)Java 参数列表
2011-11-05 19:48 2926下面的讨论以Windows ... -
(转)TOMCAT源码分析
2011-10-17 16:06 2137TOMCAT源码分析(启动框架 ... -
java写的四则运算器
2011-08-19 22:19 2723本打算做一个从RE到NFA的转换器,思路已经理清了,但是在动手 ... -
MBeanServer中instantiate 和 invoke的区别
2011-06-02 11:52 1304JMX中有两种方式调用另一个MBean中的方法 先创建一个M ... -
JMX 的一个简单例子
2011-05-30 17:41 1063废话不多说,上代码: HelloWorldMBean接口 ...
相关推荐
Commons Logging的核心价值在于它的灵活性和可插拔性,通过简单的配置切换,应用可以轻松地在不同的日志实现之间进行转换,如Log4j、Java Util Logging等,而无需修改任何源代码。 #### Log4j:强大的日志实现 Log...
- "log4j.rar": 这可能是Log4j的源码或者其他相关资源的压缩包,解压后可能包含更多实例代码、配置示例或其他辅助学习材料。 综上所述,这个资源包提供了全面了解和使用Log4j的必要工具,无论是初次接触还是希望...
综上所述,`log4j的样例代码`是一个很好的学习资源,帮助我们理解和使用Log4j框架。通过分析和实践`Log4JWebDemo`中的代码,我们可以深入理解日志管理在Java应用中的重要性,以及如何利用Log4j进行有效的日志记录和...
**Log4j学习笔记** Log4j是一款广泛应用于Java编程中的日志记录工具,由Apache软件基金会开发。它提供了一种灵活且强大的机制来记录应用的运行情况,这对于调试、性能分析、问题追踪以及系统监控至关重要。这篇学习...
**log4j学习源码教程** 在Java编程中,日志记录是不可或缺的一部分,它能够帮助开发者追踪程序运行状态,定位错误和异常,为调试和性能优化提供关键信息。Log4j是Apache组织开发的一个开源日志框架,因其强大的功能...
《深入学习log4J》是一本专注于Java日志框架Log4J的专业书籍,旨在帮助开发者深入理解并熟练运用Log4J进行系统日志管理和分析。Log4J是Apache组织开发的一个开源日志记录工具,广泛应用于Java应用程序中,提供灵活的...
这个“log4j示例项目”旨在帮助开发者理解和使用Log4j,通过该项目,我们可以深入学习Log4j的配置、使用方法以及其在实际开发中的应用。 **1. Log4j的组成部分** Log4j主要包括三个核心组件:Logger(日志器)、...
"Log4jTest" 这个文件可能是包含Log4j测试代码的源文件或打包后的可执行文件。通常,它会包含配置文件(如log4j.properties或log4j.xml)以及使用Log4j进行日志记录的Java类。 **知识点详细说明:** 1. **Log4j...
**日志框架Log4j详解** Log4j是Apache组织提供的一款开源的日志记录框架,广泛应用于Java开发中。它的核心目标是为应用程序提供...通过深入学习Log4j的源代码,开发者可以定制化日志系统,以适应各种复杂的业务场景。
在《Log4j将System.out搞到log4j中输出四》这篇博文中,作者可能详细讨论了这些步骤,并可能分享了一些实战经验。通过学习这篇博文,读者可以更深入地了解如何在实际项目中实现这一转换,提升日志管理的效率。 总结...
**Log4j学习笔记** Log4j是一款广泛应用于Java编程中的日志记录框架,由Apache软件基金会开发。它提供了一套灵活的日志记录系统,帮助开发者在开发过程中追踪应用程序的行为,便于调试、性能分析和问题排查。Log4j...
这个压缩包包含了Log4j 1.2.16的源代码,对于学习和理解Log4j的工作原理以及自定义其行为非常有帮助。 在Log4j中,核心概念包括Logger、Appender、Layout和Level。Logger是日志记录的主要接口,通过它来创建和管理...
"源码"标签暗示我们将讨论Log4j的内部机制或如何查看和理解其代码,这对于学习和定制Log4j功能很有帮助。而"工具"标签则表明Log4j是一个开发者常用的工具,它的使用和配置是提高开发效率的关键。 **压缩包文件名称...
四、Log4j的高级特性 1. **异步日志记录**:Log4j支持异步日志记录,通过AsyncAppender可以在不阻塞主线程的情况下高效地处理日志。 2. **自定义Appender和Layout**:如果内置的Appender和Layout无法满足需求,...
**深入学习log4j** 日志记录在软件开发中扮演着至关重要的角色,它帮助开发者追踪程序运行状态,定位错误,以及进行性能分析。而Apache的log4j库是Java平台上的一个著名日志框架,提供了强大的日志管理和输出功能。...
解压这个文件可以获取更多关于Log4j的资源,便于深入学习和调试。 综上所述,这个压缩包提供了一整套关于Log4j的解决方案,包括不同版本的jar包、使用说明和完整的二进制包,对于使用Log4j进行日志管理的Java开发者...
Log4j2的漏洞源于其JNDI(Java Naming and Directory Interface)功能,攻击者可以利用此功能向服务器发送恶意的JNDI链接,导致远程代码执行。一旦被成功利用,攻击者可以完全控制受影响的系统,执行任意操作。 Log...
在Java开发中,日志记录是一项至关重要的任务,它帮助开发者追踪程序运行状态,调试问题,以及优化系统性能。...在`log4j-demo`压缩包中,你可以找到一个实际应用的示例,通过学习和实践,加深对这一功能的理解。
**日志系统在软件开发中扮演着至关重要的角色,它能帮助开发者跟踪程序运行...同时,不断学习和探索log4j的高级特性,如异步日志、MDC(Mapped Diagnostic Context)等,可以进一步提升日志系统的实用性和可维护性。