关于log4j的介绍大都从三个组件:Category、Appender和layout开始。
一、介绍Category
Logger定义了一组写日志的方法。但是,Logger的魅力并不仅限于此。要理解Logger,需掌握如下三点:
1、 Logger的分层结构
可以定义多个Logger,不同Logger用一个简单的原则分成继承层次。
例如,类别“com.foo”是类别“com.foo.Bar”的parent。“java”是“java.util”的parent。根(root)位于继承级别的最上层。
获得根级别实例的方法是:
Logger loggerRoot = Logger. getRootLogger();
获得一个名为com.foo的实例方法是:
Logger logger = Logger.getLogger("com.foo");
getRootLogger和getLogger分别是Logger的两个静态方法,用于创建Logger的实例。通常,用静态方法getLogger在每一个类里定义一个logger,令logger的名字等于类名的全局名。就像如下代码:
import org.apache.log4j.Logger;
import org.apache.log4j.BasicConfigurator;
public class MyApp {
// Define a static logger variable so that it references the
// Logger instance named "MyApp".
static Logger logger = Logger.getLogger(MyApp.class);
public static void main(String[] args) {
……
}
}
2、 分级日志输出。
log4j为日志定义了从低到高的五个级别,分别是:DEBUG、INFO、WARN、ERROR、FATAL。
如果为一个Logger指定了日志级别,那么这个Logger将屏蔽低于当前级别的输出。
例如:
//设置了logger的级别
logger.setLevel(Level.INFO);
//不被输出
logger.debug("Starting search for nearest gas station.");
//将被输出的log
logger.info("Located nearest gas station.");
logger.warn("Exiting gas station search");
3、基于Logger的分层结构,下级的Logger自动继承上级Logger的输出级别。
在log4j简明手册里面有一个很好的例子:
// get a logger instance named "com.foo"
Logger logger = Logger.getLogger("com.foo");
// Now set its level. Normally you do not need to set the
// level of a logger programmatically. This is usually done
// in configuration files.
logger.setLevel(Level.INFO);
Logger barlogger = Logger.getLogger("com.foo.Bar");
// This request is enabled, because WARN >= INFO.
logger.warn("Low fuel level.");
// This request is disabled, because DEBUG < INFO.
logger.debug("Starting search for nearest gas station.");
// The logger instance barlogger, named "com.foo.Bar",
// will inherit its level from the logger named
// "com.foo" Thus, the following request is enabled
// because INFO >= INFO.
barlogger.info("Located nearest gas station.");
// This request is disabled, because DEBUG < INFO.
barlogger.debug("Exiting gas station search");
最后,总结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);
public void fatal(Object message);
// generic printing method:
public void log(Level l, Object message);
}
二、介绍Appender
Appender定义了日志的输出目标。Log4j定义了如下目标:
- l console(控制台)
- l files(文件)
- l GUI components(图形组件)
- l remote socket servers(基于socket的服务器)
- l JMS(java信息服务)
- l NT Event Loggers(Windows的事件日志)
- l remote UNIX Syslog daemons(远程UNIX的后台日志服务)。
一个logger可以有一个或多个appender。Logger的appender可以从Logger的继承层次中继承。
三、介绍layout
layout日志内容的输出格式。Layout通常保存在配置文件中。
%m
|
输出代码中指定的消息
|
%p
|
输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
|
%r
|
输出自应用启动到输出该log信息耗费的毫秒数
|
%c
|
输出所属的类目,通常就是所在类的全名
|
%t
|
输出产生该日志事件的线程名
|
%n
|
输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n”
|
%d
|
输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
|
%l
|
输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
|
四、log4j的配置文件
log4j支持支持xml和java properties(key=value)文件两种格式,从内容上两者是等价的。
下面这段代码进行快速简单的Log4j的设置(不读取配置文件)。配置的结果是加入一个ConsoleAppender到根logger,且根root的日志级别是DEBUG。输出将被采用了"%-4r [%t] %-5p %c %x - %m%n"模式的PatternLayout所格式化。
BasicConfigurator.configure();
执行下面代码将从配置文件中读取log4j的设置,设置的结果取决于配置文件的内容。
PropertyConfigurator.configure(args[0]);
执行下面代码将从XML文件中读取log4j的设置,设置的结果取决于文件的内容。
DOMConfigurator.configure(args[0]);
五、拾遗
log4j可以按照一定时间产生日志文件,比如,每天备份一个文件。
log4j可以根据日志文件大小自动产生新日志文件,比如,每100k产生一个新的日志文件。