Log4j的类图
- Logger - 日志写出器,供程序员输出日志信息
- Appender - 日志目的地,把格式化好的日志信息输出到指定的地方去
- ConsoleAppender - 目的地为控制台的Appender
- FileAppender - 目的地为文件的Appender
- RollingFileAppender - 目的地为大小受限的文件的Appender
- Layout - 日志格式化器,用来把程序员的logging request格式化成字符串
- PatternLayout - 用指定的pattern格式化logging request的Layout
Logger:日志写出器
Logger的输出方法
- public void debug(Object msg);
- public void debug(Object msg, Throwable t);
- public void info(Object msg);
- public void info(Object msg, Throwable t);
- public void warn(Object msg);
- public void warn(Object msg, Throwable t);
- public void error(Object msg);
- public void error(Object msg, Throwable t);
- public void fatal(Object msg);
- public void fatal(Object msg, Throwable t);
Logger的命名规则
Log level
- logger的level越低,表示该logger越详细
- logging request的level越高,表示该logging request越优先输出
Level.ALL
示例代码
import org.apache.log4j.Logger;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
public class Log4jTest {
public static void main(String argv[]) {
// Create a logger by the name of class Log4jTest.
Logger logger = Logger.getLogger(Log4jTest.class);
// Use the default configuration.
BasicConfigurator.configure();
// Set the logger level to Level.INFO
logger.setLevel(Level.INFO);
// This request will be disabled since Level.DEBUG
// These requests will be enabled.
logger.info("This is an info.");
logger.warn("This is a warning.");
logger.error("This is an error.");
logger.fatal("This is a fatal error.");
return;
}
}
关于logger的两点说明
- 用同名参数调用Logger.getLogger(String name)将返回同一个logger的引用。故可以在一个地方配置logger,在另外一个地方获得配置好的logger,而无须相互间传递logger的引用。
- logger的创建可以按照任意的顺序,即,父logger可以后于子logger被创建。log4j将自动维护logger的继承树。
Appender:日志目的地
// Log4j APIs : class Logger
// 为logger对象增加或者移除一个Appender对象
public void appAppender(Appender app);
public void removeAppender(Appender app);
// 获得和设置additive标志:是否继承父logger的appenders
// 注意:在设置additive标志为false时,必须保证已经为该logger设置了新的appender,
// 否则log4j将报错:log4j:WARN No appenders could be found for logger (x.y.z).
public boolean getAdditivity();
public void setAdditivity(boolean additive);
ConsoleAppender
// Log4j APIs : class ConsoleAppender extends WriterAppender
// 构造方法,使用一个Layout对象构造一个ConsoleAppender对象
// 默认情况下,ConsoleAppender的target是System.out
public ConsoleAppender(Layout layout);
// 构造方法,使用一个Layout对象和一个target字符串构造ConsoleAppender对象
// target的可能取值为ConsoleAppender.SYSTEM_OUT和ConsoleAppender.SYSTEM_ERR
public ConsoleAppender(Layout layout, String target);
FileAppender
// Log4j APIs : class FileAppender extends WriterAppender
// 构造方法,使用一个Layout对象和日志文件名构造一个FileAppender对象
public FileAppender(Layout layout, String filename)
throws IOException;
public FileAppender(Layout layout, String filename, boolean append)
throws IOException;
RollingFileAppender
// Log4j APIs : class RollingFileAppender extends FileAppender
// 构造方法,使用一个Layout对象和日志文件名构造一个RollingFileAppender对象
public RollingFileAppender(Layout layout, String filename)
throws IOException;
public RollingFileAppender(Layout layout, String filename, boolean append)
throws IOException;
// 获得和设置日志备份文件的个数
public int getMaxBackupIndex();
public void setMaxBackupIndex(int index);
// 获得和设置滚动日志文件的最大尺寸
public long getMaximumFileSize();
public void setMaximumFileSize(long size);
Layout:日志格式化器
PatternLayout
// Log4j APIs : class PatternLayout extends Layout
// 无参数构造方法,使用DEFAULT_CONVERSION_PATTERN构造一个PatternLayout
// 注意:DEFAULT_CONVERSION_PATTERN为"%m%n",只打印消息信息
public PatternLayout();
// 构造方法,使用自定义的pattern构造一个PatternLayout
public PatternLayout(String pattern);
// 获得和设置PatternLayout对象的日志pattern
public String getConversionPattern();
public void setConversionPattern(String pattern);
patterns in PatternLayout
Configuration:配置
默认的log4j初始化过程
- 检查系统属性log4j.defaultInitOverride,如果该属性被设置为false,则执行初始化;否则(只要不是false,无论是什么值,甚至没有值,都是否则),跳过初始化。
- 把系统属性log4j.configuration的值赋给变量resource。如果该系统变量没有被定义,则把resource赋值为"log4j.properties"。注意:在apache的log4j文档中建议使用定义log4j.configuration系统属性的方法来设置默认的初始化文件是一个好方法。
- 试图把resource变量转化成为一个URL对象url。如果一般的转化方法行不通,就调用org.apache.log4j.helpers.Loader.getResource(resource, Logger.class)方法来完成转化。
- 如果url以".xml"结尾,则调用方法DOMConfigurator.configure(url)来完成初始化;否则,则调用方法 PropertyConfigurator.configure(url)来完成初始化。如果url指定的资源不能被获得,则跳出初始化过程。
BasicConfigurator.configure()
- 用默认pattern创建PatternLayout对象p:
PatternLayout p = new PatternLayout("%-4r[%t]%-5p%c%x - %m%n"); - 用p创建ConsoleAppender对象a,目标是system.out,标准输出设备:
ConsoleAppender a = new ConsoleAppender(p,ConsoleAppender.SYSTEM_OUT); - 为root logger增加一个ConsoleAppender p:
rootLogger.addAppender(p); - 把root logger的log level设置为DEBUG级别:
rootLogger.setLevel(Level.DEBUG);
xml格式的log4j配置文件概述
log4j的xml配置文件的树状结构
xml declaration and DTD
|
log4j:configuration
|
+-- appender (name, class)
| |
| +-- param (name, value)
| +-- layout (class)
| |
| +-- param (name, value)
+-- logger (name, additivity)
| |
| +-- level (class, value)
| | |
| | +-- param (name, value)
| +-- appender-ref (ref)
+-- root
|
+-- param (name, class)
+-- level
| |
| +-- param (name, value)
+-- appender-ref (ref)
xml declaration and DTD
log4j:configuration (root element)
- xmlns:log4j [#FIXED attribute] : 定义log4j的名字空间,取定值"http://jakarta.apache.org/log4j/"
- appender [* child] : 一个appender子元素定义一个日志输出目的地
- logger [* child] : 一个logger子元素定义一个日志写出器
- root [? child] : root子元素定义了root logger
appender
- name [#REQUIRED attribute] : 定义appender的名字,以便被后文引用
- class [#REQUIRED attribute] : 定义appender对象所属的类的全名
- param [* child] : 创建appender对象时传递给类构造方法的参数
- layout [? child] : 该appender使用的layout对象
layout
- class [#REQUIRED attribute] : 定义layout对象所属的类的全名
- param [* child] : 创建layout对象时传递给类构造方法的参数
logger
- name [#REQUIRED attribute] : 定义logger的名字,以便被后文引用
- additivity [#ENUM attribute] : 取值为"true"(默认)或者"false",是否继承父logger的属性
- level [? child] : 定义该logger的日志级别
- appender-ref [* child] : 定义该logger的输出目的地
root
- param [* child] : 创建root logger对象时传递给类构造方法的参数
- level [? child] : 定义root logger的日志级别
- appender-ref [* child] : 定义root logger的输出目的地
level
- class [#IMPLIED attribute] : 定义level对象所属的类,默认情况下是"org.apache.log4j.Level类
- value [#REQUIRED attribute] : 为level对象赋值。可能的取值从小到大依次为"all"、"debug"、"info"、"warn"、"error"、"fatal"和"off"。当值为"off"时表示没有任何日志信息被输出
- param [* child] : 创建level对象时传递给类构造方法的参数
appender-ref
- ref [#REQUIRED attribute] : 一个appender元素的名字的引用
- appender-ref元素没有子元素
param
- name and value [#REQUIRED attributes] : 提供参数的一组名值对
- param元素没有子元素
在xml文件中配置appender和layout
创建ConsoleAppender对象
... ... ... ...
... ...
... ... ... ...
创建FileAppender对象
... ... ... ...
... ...
... ... ... ...
创建RollingFileAppender对象
... ... ... ...
... ...
... ... ... ...
创建PatternLayout对象
... ... ... ...
... ... ... ...
我自己的一个使用xml文件配置log4j环境的很简单的例子
import org.apache.log4j.xml.DOMConfigurator;
public class SapFrame extends JFrame {
static {
DOMConfigurator.configure(SapFrame.class.getResource("wsota-rc.log4j.xml"));
}
... ... ... ...
}
Log4j的编码习惯
- 让每个类都拥有一个private static的Logger对象,用来输出该类中的全部日志信息
- 使用xml文件来完成对log4j环境的配置。在项目的main class中的静态初始化块里放log4j环境的配置代码。注意:在一个项目中,log4j环境只需要被配置一次,而不是在每个使用了logger的类里都需要调用一次
- 用MyClass.class作为参数创建该类的静态Logger对象