(未完成,待修改)
一、安装Log4j
log4j的库文件可以在官方网站下载:
二、log4j.properties的目录搜索规则
在src/目录下创建一个log4j.properties文件,即LCF(Log Configuration File)。
默认的LCF,即log4j.properties,只能在CLASSPATH内被log4j找到。
由于Eclipse中src下的非java文件会自动复制到bin目录(CLASSPATH内)下,所以log4j能找到bin/log4j.properties。
对于打包好的jar,log4j.properties最好放在jar外,把它的目录包含于classpath内。
或者用特定的LCF文件名(见下)精确地定位它,而不必放在CLASSPATH内。
三、指定特定的LCF文件名(属性文件名不是log4j.properties)
有两种方法可以让LCF指向一个.properties文件而非classpath下的log4j.properties:
方法一:log4j.configuration
创建TestLog4j.java:
编译(MinGW):
$ javac -cp log4j-1.2.16.jar *.java
运行:
$ java -cp "log4j-1.2.16.jar;." TestLog4j
因为log4j.properties文件不存在,所以出现警告:
log4j:WARN No appenders could be found for logger (TestLog4j).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Hello, world
书写log4j.properties
log4j.rootLogger=DEBUG, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
log4j.logger.TestLog4j=DEBUG
然后运行(不需要重新编译,因为log4j.properties已经在classpath内):
$ java -cp "log4j-1.2.16.jar;." TestLog4j
2011-05-07 15:32:48,062 [main] INFO TestLog4j - Entering application.
Hello, world
把log4j.properties重命名为log4j_TestLog4j.properties,然后运行:
log4j:WARN No appenders could be found for logger (TestLog4j).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Hello, world
此时使用log4j.configuration改变LCF的名称
$ java -Dlog4j.configuration=log4j_TestLog4j.properties -cp "log4j-1.2.16.jar;." TestLog4j
2011-05-07 15:36:25,562 [main] INFO TestLog4j - Entering application.
Hello, world
方法二,PropertyConfigurator.configure():
同上例,把TestLog4j.java改为
import org.apache.log4j.*;
public class TestLog4j {
static Logger logger = Logger.getLogger(TestLog4j.class);
public final static void main(String[] args) {
logger.info("Entering application.");
System.out.println("Hello, world");
}
}
运行:
$ java -cp "log4j-1.2.16.jar;." TestLog4j
2011-05-07 15:40:05,812 [main] INFO TestLog4j - Entering application.
Hello, world
上述两种方法都可以把JCF指向非classpath目录下的属性文件。
而默认的log4j.properties只能放在classpath定义的范围内。
特定的LCF文件名的好处是:把多个配置文件放在和jar不同的目录下,方便管理。
不过对于调试,用log4j.properties一个配置文件就足够了(可以用#注释进行切换)。
四、根日志器(RootLogger,log4j.rootLogger)
log4j.rootLogger = ALL, myFileAppender, myConsoleAppender
用于指定缺省的日志级别和(一个或多个)输出器。
用log4j.rootLogger,就不需要在子级logger中重复定义日志级别和输出器。
五、输出器(Appender,log4j.appender.XXX)
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
定义了一个输出器A1,
然后设置其appender实现类,layout实现类,layout转换模式参数。
log4j允许一个logger装配多个appender,
也就是说可以同时把一条日志发到多个不同的目的地。
log4j可以使用预定义的appender实现,也允许自己实现appender。
org.apache.log4j.ConsoleAppender: 输出到控制台
org.apache.log4j.jdbc.JDBCAppender: 写入数据库
org.apache.log4j.net.JMSAppender: 写入Java消息队列
org.apache.log4j.nt.NTEventLogAppender: 写入NT事件日志
org.apache.log4j.net.SyslogAppender: 写入Unix/Linux Syslog
org.apache.log4j.lf5.LF5Appender: 写入基于Swing的控制台
org.apache.log4j.net.TelnetAppender: 用远程登陆的方式监听日志
org.apache.log4j.net.SocketAppender: 写入套接字
六、子日志器(Logger,log4j.logger.XXX)
log4j.logger.TestLog4j=DEBUG
它可以像RootLogger那样,可以同时定义日志级别和输出器,
但一般的做法是把输出器放在log4j.rootLogger的值中,然后用缺省值继承它。
由于约定的写法:
Logger.getLogger(<类名>.class)
所以通常子日志器的键名是log4j.logger.<名字空间>.<类名>
如果是非约定的写法:
Logger.getLogger("<日志器名>")
则键名是
log4j.logger.<日志器名>
对于log4j.logger.<名字空间>.<类名>这样的logger,可以从
log4j.logger.<名字空间>的logger中继承配置。
同样,对于名字空间的logger,可以从上一级名字空间的logger中继承配置。
七、日志级别(Level)
Java代码中使用的Level有6级
TRACE < DEBUG < INFO < WARN < ERROR < FATAL
而在LCF(log4j.properties)中有8级
OFF < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < ALL
多出来的OFF和ALL用于完全禁用日志和记录所有日志。
在日志器中使用Level,例如
log4j.logger.TestLog4j=DEBUG
则表示DEBUG和DEBUG以上的日志被输出,
比DEBUG的优先级低的TRACE日志被忽略。
八、日志格式(Layout)
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
layout和appender一一对应地关联(不同于appender,一个logger可以和多个appender关联),
例如上面的A1.layout和A1关联。
layout向appender提供日期、事件、类名和线程状态等附加信息,
还可以定义它们和Java代码内的日志信息的组合方式。
log4j提供预定义的layout实现类。
org.apache.log4j.SimpleLayout: 简单格式
org.apache.log4j.PatternLayout: 模式格式
九、在Java代码中配置log4j
不推荐这种做法。
(TODO)