log4j使得日志管理更加方便,通过配置文件可以实现在运行时控制。
通过log4j,
可以在程序中指定每一条日志的级别(error,warn, debug, info),从而可以根据需求,只输出某个级别和该级别以下的日志。
可以控制日志的附加目的地(Appender),可以是多个,包括控制台、文件、远程套接字服务器,NT事件记录器和远程UNIX Syslog守护程序。
可以定制输出的日志的样式(Layout)。
Log4j主要包含了三个组件:loggers(对应早期版本的Category类), appenders,以及layouts。
Loggers是命名的实体,命名对大小写敏感,并遵循层次命名规则(名字为com.foo.Bar的logger是名字为com.foo的子logger)
根logger总是存在,并且通过Logger.getRootLogger方法得到。其它logger通过Logger.getLogger(String name)得到。
以相同的名字为参数调用Logger.getLogger(Stringname)总是得到同一个logger对象。
Loggers可以指定级别(TRACE, DEBUG, INFO, WARN, ERROR, FATAL)。如果没有指定级别,则是按照层级继承关系,第一个指定了级别的祖先logger对应的级别。
根logger总是指定了级别
日志请求(loggingrequest)可以调用不同的输出方法:debug,info, warn, error, fatal, 以及log。
日志请求称为是启用的(enabled)如果级别>=logger的级别
// 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");
log4j提供的Appender有以下几种:(用在property配置文件中)
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
Appender Additivity
Logger C的一条日志语句将会输出到所有C以及C的祖先的appender中,相当于appender将会继承下去。
如果C的某个祖先P将additivity标志设置为false,则C输出的appender只到P为止。
布局
PatternLayout可以控制输出的格式,控制的模式与C语言中的printf方法类似。
%r 时间 0
%t 方法名 main
%p 优先级 DEBUG/INFO/ERROR
%c 所属类的全名(包括包名)
%l 发生的位置,在某个类的某行
%m 输出代码中指定的讯息,如log(message)中的message
%n 输出一个换行符号
Log4j的配置
可以直接使用log4j提供的简单的配置
BasicConfigurator.configure();
也可以通过XML文件或者Java properties(key = value)文件配置
Property文件例子:
# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
property文件通过PropertyConfigurator.configure(String filename)读入
PropertyConfigurator.configure(args[0]);
XML文件配置例子:
<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
<appendername="myConsole" class="org.apache.log4j.ConsoleAppender">
<layoutclass="org.apache.log4j.PatternLayout">
<paramname="ConversionPattern" value="[%d{MM-dd HH:mm:ss,SSS\} %-5p][%t] %c{2\} - %m%n" />
</layout>
</appender>
<root>
<priorityvalue="info" />
<appender-refref="myConsole" />
</root>
</log4j:configuration>
XML配置文件通过DOMConfigurator.configure ( String filename ) 读入
参考: