Log4j有三个组件,分别是 loggers, appenders and layouts。
Logger - 日志写出器 ,供程序员输出日志信息
Appender - 日志目的地 ,把格式化好的日志信息输出到指定的地方去
Layout - 日志格式化器 ,用来把程序员的 logging request 格式化成字符串
1.Loger
Loger name是大小写敏感的。Logger的定义遵循以下的规则:
例如:
the logger named "com.foo"
is a parent of the logger named "com.foo.Bar"
.
"java"
is a parent of "java.util"
and an ancestor of "java.util.Vector"
.
RootLogger只能通过Logger.getRootLogger方法取得,非RootLogger通过Logger.getLogger(Name)取得。
Logger level有TRACE,DEBUG,INFO,WARN,ERROR andFATAL这几种,定义在org.apache.log4j.Level类里。
level的继承:
如果一个Logger没有声明level,那么它将继承自它的ancestor里离它最近的并且声明了level的ancestor的level。
继承规则:
[注]RootLogger必须声明一个Level。
Level级别:DEBUG < INFO < WARN < ERROR < FATAL。
如果getLogger()方法参数相同的话,将返回同一个Logger对象的引用。
例如:
Logger x = Logger.getLogger("wombat");
Logger y = Logger.getLogger("wombat");
x和y指向同一个Logger对象。
2.Appenders
一个Logger可以有多个appender。通过addAppender方法向Logger增加appender。
Each enabled logging request for a given logger will be forwarded to all the appenders in that logger as well as the appenders higher in the hierarchy.
也就是说打印日志也具有继承性,子Logger在打印日志时,同时也会向它的祖先Logger的appender输出日志。
例如:如果RootLogger具有一个appender是Console,那么任何Logger都会向Console输出日志。
这是Log4j的默认行为,也可以通过设定additive
为false来改变默认行为。
日志输出的继承性规则如下:
3.Layout
根据配置信息格式化日志的输出信息。
Log4j 提供的 layout 有以下几种:
1.org.apache.log4j.HTMLLayout (以 HTML 表格形式布局),
2.org.apache.log4j.PatternLayout (可以灵活地指定布局模式),
3.org.apache.log4j.SimpleLayout (包含日志信息的级别和信息字符串),
4.org.apache.log4j.TTCCLayout (包含日志产生的时间、线程、类别等等信息)
Log4J 采用类似 C 语言中的 printf 函数的打印格式格式化日志信息,打印参数如下:
%p 输出优先级,即 DEBUG , INFO , WARN , ERROR , FATAL
%r 输出自应用启动到输出该 log 信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符, Windows 平台为 “rn” , Unix 平台为 “n”
%m 输出代码中指定的消息
%d 输出日志时间点的日期或时间,默认格式为 ISO8601 ,也可以在其后指定格式,比如: %d{yyy MMM dd HH:mm:ss,SSS} ,输出类似: 2002 年 10 月 18 日 22 : 10 : 28 , 921
一个简单的log4j.properties 配置文件:
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例: Testlog4.main(TestLog4.java:10)
由此可见,任何一个类都有一个Logger,如果想设定某个类或者某个包下所有类的日志级别,appender,可以单独对类或者包进行配置。
log4j.logger.类名/包名 = level,appender1,append2,.....
Log4j初始化顺序(The exact default initialization algorithm is defined as follows):