一.基本构成
Log4J最核心的也就5个类:Logger用于对日志记录行为的抽象,提供记录不同级别日志的接口;Level对日志级别的抽象;Appender是对记录日志形式的抽象;Layout是对日志行格式的抽象;而LoggingEvent是对一次日志记录过程中所能取到信息的抽象。另外LoggerRepository是Logger实例的容器。实现Log4J主要功能相关的类图:
二.流程
2.1初始化流程
2.2一次记录记录的流程
三.Logger类
Logger是一个命名的实体,其名字一般用”.”分割以体现不同Logger的层次关系,其中Level和Appender信息可以从父节点中获取,因而Logger类中还具有name和parent属性。
- /**
- The assigned level of this category. The
- <code>level</code> variable need not be assigned a value in
- which case it is inherited form the hierarchy. */
- volatile protected Level level;
- /**
- The parent of this category. All categories have at least one
- ancestor which is the root category. */
- volatile protected Category parent;
另外,在实际开发中经常会遇到要把日志信息同时写到不同地方,如同时写入文件和控制台,因而一个Logger实例中可以包含多个Appender,为了管理多个Appender,Log4J抽象出了AppenderAttachable接口,它定义了几个用于管理多个Appender实例的方法,这些方法由AppenderAttachableImpl类实现,而Logger会实例化AppenderAttachableImpl,并将这些方法代理给该实例:
- public interface AppenderAttachable {
- /**
- Add an appender.
- */
- public
- void addAppender(Appender newAppender);
- /**
- Get all previously added appenders as an Enumeration. */
- public
- Enumeration getAllAppenders();
- /**
- Get an appender by name.
- */
- public
- Appender getAppender(String name);
- /**
- Returns <code>true</code> if the specified appender is in list of
- attached attached, <code>false</code> otherwise.
- @since 1.2 */
- public
- boolean isAttached(Appender appender);
- /**
- Remove all previously added appenders.
- */
- void removeAllAppenders();
- /**
- Remove the appender passed as parameter from the list of appenders.
- */
- void removeAppender(Appender appender);
- /**
- Remove the appender with the name passed as parameter from the
- list of appenders.
- */
- void
- removeAppender(String name);
- }
五.Filter
在Log4J中,Filter组成一条链,它定了以decide()方法,由子类实现,若返回DENY则日志不会被记录、NEUTRAL则继续检查下一个Filter实例、ACCEPT则Filter通过,继续执行后面的写日志操作。使用Filter可以为Appender加入一些出了threshold以外的其他逻辑,由于它本身是链状的,而且它的执行是横跨在Appender的doAppend方法中。