Apache Log4j 架构 | Apache Log4j Architecture Level
Apache Log4j是当前在J2EE和J2SE开发中用得最多的日志框架(几乎所有项目都用它),因为它具有出色的性能、灵活的配置以及丰富的功能,并且在业务有特殊的要求时,可以使用自定义组件来代替框架中已有的组件来满足要求。
一、组件介绍 | Component Introducation
Log4j主要有三个组件:
1、Logger。
负责供客户端代码调用,执行debug(Object msg)、info(Object msg)、warn(Object msg)、error(Object msg)等方法。
Logger 继承自 Category,Logger有三个子类:
Logger 一共有如下日志级别:
2、Appender。
负责日志的输出,Log4j已经实现了多种不同目标的输出方式,可以向文件输出日志、向控制台输出日志、向Socket输出日志等。当前Log4j-1.2.6中Appender的子类实现及其层次结构如下:
org.apache.log4j.Appender ( interface )
3、Layout。
负责日志信息的格式化。
已经实现的类有:
二、执行顺序及关系 | Execution Flow Diagram
调用Log4j输出日志时,调用各个组件的顺序如下图所示:
1、日志信息传入 Logger。
2、将日志信息封装成 LoggingEvent 对象并传入 Appender。
4、在 Appender 中调用 Filter 对日志信息进行过滤,调用 Layout 对日志信息进行格式化,然后输出。

一、组件介绍 | Component Introducation
Log4j主要有三个组件:
1、Logger。
负责供客户端代码调用,执行debug(Object msg)、info(Object msg)、warn(Object msg)、error(Object msg)等方法。
Logger 继承自 Category,Logger有三个子类:
- org.apache.log4j.spi.RootLogger。这是默认的Logger类。
- org.apache.log4j.spi.NOPLogger。这个类针对日志的输出不做任何操作,直接丢弃。
- org.apache.log4j.spi.RootCategory。此类已经不推荐使用,用RootLogger代替。
Logger 一共有如下日志级别:
- DEBUG
- INFO
- WARN
- ERROR
- FATAL
- ALL 所有的日志输出,不论其级别。
- OFF 所有日志一律不输出,与ALL相反。
2、Appender。
负责日志的输出,Log4j已经实现了多种不同目标的输出方式,可以向文件输出日志、向控制台输出日志、向Socket输出日志等。当前Log4j-1.2.6中Appender的子类实现及其层次结构如下:
org.apache.log4j.Appender ( interface )
- org.apache.log4j.AppenderSkeleton (abstract class)
- org.apache.log4j.jdbc.JDBCAppender (通过JDBC向数据库输出日志信息)
- org.apache.log4j.WriterAppender
- org.apache.log4j.FileAppender (向文件输出日志信息,只产生一个日志文件)
- org.apache.log4j.RollingFileAppender (日志文件到达指定大小时产生新的日志文件,可指定最大备份日志数量)
- org.apache.log4j.varia.ExternallyRolledFileAppender
- org.apache.log4j.DailyRollingFileAppender (可以指定每月、每周、每天、每小时滚动生成日志文件)
- org.apache.log4j.ConsoleAppender (向控制台输出日志信息)
- org.apache.log4j.net.TelnetAppender (通过telnet向远程输出日志信息)
- org.apache.log4j.net.SyslogAppender
- org.apache.log4j.net.SocketHubAppender
- org.apache.log4j.net.SocketAppender (通过socket向远程输出日志信息)
- org.apache.log4j.varia.NullAppender
- org.apache.log4j.performance.NullAppender
- org.apache.log4j.lf5.LF5Appender
- org.apache.log4j.net.JMSAppender (通过jms向远程输出日志信息)
- org.apache.log4j.nt.NTEventLogAppender
- org.apache.log4j.AsyncAppender (异步输出日志信息)
- org.apache.log4j.net.SMTPAppender (通过smtp向远程输出日志信息)
3、Layout。
负责日志信息的格式化。
- org.apache.log4j.xml.XMLLayout (以XML格式格式日志信息)
- org.apache.log4j.SimpleLayout(格式化结果包括日志信息的等级和日志信息)
- org.apache.log4j.PatternLayout (最灵活的格式化方式,可以用以下的各项进行组合配置:
%c logger名字空间的全称,如果加上{<层数>}表示列出从最内层算起的指定层数的名字空间。
%C 调用logger的类的全名(包含包路径)。
%d 日志记录时间,{<日期格式>}使用ISO8601定义的日期格式。
%F 调用logger的源文件名。
%l 日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。
%L 调用logger的代码行
%m 输出消息。
%M 调用logger的方法名。
%n 当前平台下的换行符。
%p 该条日志的优先级。
%r 从程序启动时到记录该条日志时已经经过的毫秒数。
%t 产生该日志事件的线程名。
%x 按NDC(Nested Diagnostic Context,线程堆栈)顺序输出日志。
%X 按MDC(Mapped Diagnostic Context,线程映射表)输出日志。通常用于多个客户端连接同一台服务器,方便服务器区分是那个客户端访问留下来的日志。
%% 显示一个百分号。)
- org.apache.log4j.HTMLLayout
- org.apache.log4j.EnhancedPatternLayout
- org.apache.log4j.helpers.DateLayout
- org.apache.log4j.TTCCLayout
二、执行顺序及关系 | Execution Flow Diagram
调用Log4j输出日志时,调用各个组件的顺序如下图所示:
1、日志信息传入 Logger。
2、将日志信息封装成 LoggingEvent 对象并传入 Appender。
4、在 Appender 中调用 Filter 对日志信息进行过滤,调用 Layout 对日志信息进行格式化,然后输出。
转载于:https://my.oschina.net/psuyun/blog/304305