Java日志库学习笔记

(未完成,待修改)

 

 

一、安装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)

 

你可能感兴趣的:(java,apache,log4j,linux,配置管理)