`
mabusyao
  • 浏览: 253337 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Log4j 代码学习

 
阅读更多

最近闲来无事,正好手头上有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的最佳入口。

  • 大小: 26.8 KB
  • 大小: 43.7 KB
分享到:
评论

相关推荐

    log4j学习

    Commons Logging的核心价值在于它的灵活性和可插拔性,通过简单的配置切换,应用可以轻松地在不同的日志实现之间进行转换,如Log4j、Java Util Logging等,而无需修改任何源代码。 #### Log4j:强大的日志实现 Log...

    log4j(实例代码+文档)

    - "log4j.rar": 这可能是Log4j的源码或者其他相关资源的压缩包,解压后可能包含更多实例代码、配置示例或其他辅助学习材料。 综上所述,这个资源包提供了全面了解和使用Log4j的必要工具,无论是初次接触还是希望...

    log4j的样例代码

    综上所述,`log4j的样例代码`是一个很好的学习资源,帮助我们理解和使用Log4j框架。通过分析和实践`Log4JWebDemo`中的代码,我们可以深入理解日志管理在Java应用中的重要性,以及如何利用Log4j进行有效的日志记录和...

    Log4j的学习笔记

    **Log4j学习笔记** Log4j是一款广泛应用于Java编程中的日志记录工具,由Apache软件基金会开发。它提供了一种灵活且强大的机制来记录应用的运行情况,这对于调试、性能分析、问题追踪以及系统监控至关重要。这篇学习...

    log4j学习源码教程

    **log4j学习源码教程** 在Java编程中,日志记录是不可或缺的一部分,它能够帮助开发者追踪程序运行状态,定位错误和异常,为调试和性能优化提供关键信息。Log4j是Apache组织开发的一个开源日志框架,因其强大的功能...

    深入学习log4J

    《深入学习log4J》是一本专注于Java日志框架Log4J的专业书籍,旨在帮助开发者深入理解并熟练运用Log4J进行系统日志管理和分析。Log4J是Apache组织开发的一个开源日志记录工具,广泛应用于Java应用程序中,提供灵活的...

    log4j示例项目

    这个“log4j示例项目”旨在帮助开发者理解和使用Log4j,通过该项目,我们可以深入学习Log4j的配置、使用方法以及其在实际开发中的应用。 **1. Log4j的组成部分** Log4j主要包括三个核心组件:Logger(日志器)、...

    log4j测试程序

    "Log4jTest" 这个文件可能是包含Log4j测试代码的源文件或打包后的可执行文件。通常,它会包含配置文件(如log4j.properties或log4j.xml)以及使用Log4j进行日志记录的Java类。 **知识点详细说明:** 1. **Log4j...

    log4j讲解源代码

    **日志框架Log4j详解** Log4j是Apache组织提供的一款开源的日志记录框架,广泛应用于Java开发中。它的核心目标是为应用程序提供...通过深入学习Log4j的源代码,开发者可以定制化日志系统,以适应各种复杂的业务场景。

    Log4j将System.out搞到log4j中输出四

    在《Log4j将System.out搞到log4j中输出四》这篇博文中,作者可能详细讨论了这些步骤,并可能分享了一些实战经验。通过学习这篇博文,读者可以更深入地了解如何在实际项目中实现这一转换,提升日志管理的效率。 总结...

    Log4j学习笔记和一套完整定义实例

    **Log4j学习笔记** Log4j是一款广泛应用于Java编程中的日志记录框架,由Apache软件基金会开发。它提供了一套灵活的日志记录系统,帮助开发者在开发过程中追踪应用程序的行为,便于调试、性能分析和问题排查。Log4j...

    apache-log4j-1.2.16.rar_apache log4j 1.2.16_log4j source code_lo

    这个压缩包包含了Log4j 1.2.16的源代码,对于学习和理解Log4j的工作原理以及自定义其行为非常有帮助。 在Log4j中,核心概念包括Logger、Appender、Layout和Level。Logger是日志记录的主要接口,通过它来创建和管理...

    log4j简单使用

    "源码"标签暗示我们将讨论Log4j的内部机制或如何查看和理解其代码,这对于学习和定制Log4j功能很有帮助。而"工具"标签则表明Log4j是一个开发者常用的工具,它的使用和配置是提高开发效率的关键。 **压缩包文件名称...

    log4j jarjar包

    四、Log4j的高级特性 1. **异步日志记录**:Log4j支持异步日志记录,通过AsyncAppender可以在不阻塞主线程的情况下高效地处理日志。 2. **自定义Appender和Layout**:如果内置的Appender和Layout无法满足需求,...

    深入学习log4j

    **深入学习log4j** 日志记录在软件开发中扮演着至关重要的角色,它帮助开发者追踪程序运行状态,定位错误,以及进行性能分析。而Apache的log4j库是Java平台上的一个著名日志框架,提供了强大的日志管理和输出功能。...

    新版本与旧版本log4j.jar包下载,附使用说明----.zip

    解压这个文件可以获取更多关于Log4j的资源,便于深入学习和调试。 综上所述,这个压缩包提供了一整套关于Log4j的解决方案,包括不同版本的jar包、使用说明和完整的二进制包,对于使用Log4j进行日志管理的Java开发者...

    log4j2_detect_gui.zip

    Log4j2的漏洞源于其JNDI(Java Naming and Directory Interface)功能,攻击者可以利用此功能向服务器发送恶意的JNDI链接,导致远程代码执行。一旦被成功利用,攻击者可以完全控制受影响的系统,执行任意操作。 Log...

    log4j-控制指定类,包的日志级别:log4j-demo.zip

    在Java开发中,日志记录是一项至关重要的任务,它帮助开发者追踪程序运行状态,调试问题,以及优化系统性能。...在`log4j-demo`压缩包中,你可以找到一个实际应用的示例,通过学习和实践,加深对这一功能的理解。

    log4j日志配置以及配置文件详解

    **日志系统在软件开发中扮演着至关重要的角色,它能帮助开发者跟踪程序运行...同时,不断学习和探索log4j的高级特性,如异步日志、MDC(Mapped Diagnostic Context)等,可以进一步提升日志系统的实用性和可维护性。

Global site tag (gtag.js) - Google Analytics