Log4j源码浅析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a040600145/article/details/53392123

一.基本构成

  Log4J最核心的也就5个类:Logger用于对日志记录行为的抽象,提供记录不同级别日志的接口;Level对日志级别的抽象;Appender是对记录日志形式的抽象;Layout是对日志行格式的抽象;而LoggingEvent是对一次日志记录过程中所能取到信息的抽象。另外LoggerRepositoryLogger实例的容器实现Log4J主要功能相关的类图:

 二.流程

2.1初始化流程

2.2一次记录记录的流程

 三.Logger类

  Logger是一个命名的实体,其名字一般用”.”分割以体现不同Logger的层次关系,其中LevelAppender信息可以从父节点中获取,因而Logger类中还具有nameparent属性。

Java代码
  1. /** 
  2.    The assigned level of this category.  The 
  3.    <code>level</code> variable need not be assigned a value in 
  4.    which case it is inherited form the hierarchy.  */  
  5. volatile protected Level level;  
  6.   
  7. /** 
  8.    The parent of this category. All categories have at least one 
  9.    ancestor which is the root category. */  
  10. volatile protected Category parent;  
 

另外,在实际开发中经常会遇到要把日志信息同时写到不同地方,如同时写入文件和控制台,因而一个Logger实例中可以包含多个Appender,为了管理多个AppenderLog4J抽象出了AppenderAttachable接口,它定义了几个用于管理多个Appender实例的方法,这些方法由AppenderAttachableImpl类实现,而Logger会实例化AppenderAttachableImpl,并将这些方法代理给该实例:

 

Java代码
  1. public interface AppenderAttachable {  
  2.     
  3.   /** 
  4.      Add an appender. 
  5.    */  
  6.   public  
  7.   void addAppender(Appender newAppender);  
  8.   
  9.   /** 
  10.      Get all previously added appenders as an Enumeration.  */  
  11.   public  
  12.   Enumeration getAllAppenders();  
  13.   
  14.   /** 
  15.      Get an appender by name. 
  16.    */  
  17.   public  
  18.   Appender getAppender(String name);  
  19.   
  20.     
  21.   /** 
  22.      Returns <code>true</code> if the specified appender is in list of 
  23.      attached attached, <code>false</code> otherwise. 
  24.  
  25.      @since 1.2 */  
  26.   public   
  27.   boolean isAttached(Appender appender);  
  28.   
  29.   /** 
  30.      Remove all previously added appenders. 
  31.   */  
  32.   void removeAllAppenders();  
  33.   
  34.   
  35.   /** 
  36.      Remove the appender passed as parameter from the list of appenders. 
  37.   */  
  38.    void removeAppender(Appender appender);  
  39.   
  40.   
  41.  /** 
  42.     Remove the appender with the name passed as parameter from the 
  43.     list of appenders.   
  44.   */  
  45.  void  
  46.  removeAppender(String name);     
  47. }  
 四.RootLogger类
  在Log4J中,所有Logger实例组成一个单根的树状结构,由于Logger实例的根节点有一点特殊:它的名字为“root”,它没有父节点,它的Level字段必须设值以防止其他Logger实例都没有设置Level值的情况。基于这些考虑,Log4J通过继承Logger类实现了RootLogger类,它用于表达所有Logger实例的根节点。

 五.Filter

Log4J中,Filter组成一条链,它定了以decide()方法,由子类实现,若返回DENY则日志不会被记录、NEUTRAL则继续检查下一个Filter实例、ACCEPTFilter通过,继续执行后面的写日志操作。使用Filter可以为Appender加入一些出了threshold以外的其他逻辑,由于它本身是链状的,而且它的执行是横跨在AppenderdoAppend方法中


猜你喜欢

转载自blog.csdn.net/a040600145/article/details/53392123
今日推荐