Log4j手册
文档版本:1.1
编者:陈华
:clinker@163
发布日期:2006年4月5日
1. 简介 (1)
1. 简介 (3)
1.1 概述 (3)
1.2 主要组件 (3)
2. Logger (4)
2.1 层次结构 (4)
2.2 输出级别 (5)
3. Appenders (7)
3.1 概念说明 (7)
3.2 Appender的配置 (7)
3.3 Appender的添加性 (8)
4. Layouts (8)
4.1 概念说明 (8)
4.2 Layout的配置 (9)
5. 配置 (10)
6. 默认的初始化过程 (13)
7. 配置范例 (14)
7.1 Tomcat (14)
8. Nested Diagnostic Contexts (14)
9. 优化 (15)
9.1 日志为禁用时,日志的优化 (15)
9.2 当日志状态为启用时,日志的优化 (16)
9.3 日志信息的输出时,日志的优化 (16)
10. 总结 (16)
11. 附录 (17)
11.1 参考文档 (17)
11.2 比较全面的配置文件 (17)
11.3 日志乱码的解决 (19)
1. 简介
1.1 概述
程序开发环境中的日志记录是由嵌入在程序中以输出一些对开发人员有用信息的语句所组成。例如,跟踪语句(trace),结构转储和常见的System.out.println或printf调试语句。log4j提供分级方法在程序中嵌入日志记录语句。日志信息具有多种输出格式和多个输出级别。
使用一个专门的日志记录包,可以减轻对成千上万的System.out.println语句的维护成本,因为日志记录可以通过配置脚本在运行时得以控制。log4j维护嵌入在程序代码中的日志记录语句。通过规范日志记录的处理过程,一些人认为应该鼓励更多的使用日志记录并且获得更高程度的效率。
1.2 主要组件
Log4j有三个主要组件: loggers、appenders和layouts。这三个组件协同工作,使开发人员能够根据消息类型和级别来记录消息,并且在程序运行期控制消息的输出格式位置。 Logger:日志记录器
Logger 负责处理日志记录的大部分操作。
Appender:日志信息的输出目的地
Appender 负责控制日志记录操作的输出。
Layout:日志格式化器
Layout 负责格式化Appender的输出。
图1-1 Log4j的类图
2. Logger
日志记录器(Logger)是日志处理的核心组件。
log4j2不打印日志
2.1 层次结构
Log4j首要的相对于简单的使用System.out.println()方法的优点是基于它的在禁止一些特定的信息输出的同时不妨碍其它信息的输出的能力。这个能力源自于日志命名空间,也就是说,所有日志声明的空间,它根据一些开发员选择的公式而分类。
Loggers 被指定为实体,Logger的名字是大小写敏感的,它们遵循以下的命名规则:
命名继承:如果类别的名称(后面加一个点)是其子类别名称的前缀,则它就是另一个类别的祖辈。
如果一个类别(Logger)和它的子类别之间没有其它的继承关系,我们就称之为parent与child的关系。
例如,类别"com.foo"是类别"com.foo.Bar"的parent。类似的,"java"是"java.util"的parent,是"java.util.Vector"的父辈。
根(root) 类别位于logger继承结构的最上层。它有两种例外:
(1)它一直存在
(2)它不能根据名称而获得。
调用类的静态方法RootLogger可以得到它。其它所有的Logger可以通过静态方法Logger而得到它们自己的实例。这个方法取希望的Logger名作为参数。Logger 的一些基本的方法示例如下:
package org.apache.Log4j;
public class Logger {
// Creation & retrieval methods:
public static Logger getRootLogger();
public static Logger getLogger(String name);
// printing methods:
public void debug(Object message);
public void info(Object message);
public void warn(Object message);
public void error(Object message);
// generic printing method:
public void log(Level l, Object message);
}
Loggers可以被分配的级别。所有级别的集合包括:DEBUG、INFO、WARN、ERROR、FATAL。它们被定义于org.apache.Log4j.Level 类。虽然我们不鼓励,但是你们可以通过继承Level 类来定义你们自己的级别。我们随后将介绍一个比较好的方法。
如果一个Logger没有被分配一个级别,那么它将从一个被分配了级别的最接近它的ancestor 哪里继承。正规的说:级别的继承:对于一个给定的Logger C,它的继承的级别等于从C 开始上溯到的第一个拥有非空级别的Logger的级别。
为了保证所有的Logger最终能够继承到一个级别,根Logger通常有一个已经定义了的级别。以下四个表中的数据演示了根据以上规则得到的结果。
例1:
类别名分配的级别继承的级别
root Proot Proot
X none Proot
X.Y none Proot
X.Y.Z none Proot
在例子1中,只有根Logger定义了一个级别,它的级别的值"Proot"被所有其它的Loggers X、X.Y和X.Y.Z所继承。
例2:
类别名分配的级别继承的级别
root Proot Proot
X Px Px
X.Y Pxy Pxy
X.Y.Z Pxyz Pxyz
在例子2中,所有的Logger都有一个被分配的级别值,所以它们不需要级别继承。
例3:
类别名分配的级别继承的级别
root Proot Proot
X Px Px
X.Y none Px
X.Y.Z Pxyz Pxyz
在例子3中,根Logger,以及X和X.Y.Z被分别分配了级别Proot,Px和Pxyz。Logger X.Y 从它的父类别X继承了级别值Px。
例4:
类别名分配的级别继承的级别
root Proot Proot
X Px Px
X.Y none Px
X.Y.Z none Px
在例子4中,根Logger和X被分别分配了级别"Proot"和"Px",Logger X.Y 和X.Y.Z从被分配了级别的最接近它们的祖先X那里得到继承。
2.2 输出级别
我们需要通过调用Logger的输出的实例方法之一来实现日志请求。这些输出的方法是debug、info、warn、error、fatal和log。
通过定义输出方法来区分日志的请求的级别。例如,如果c是一个Logger的实例,那么声