您的位置:首页 > 编程语言 > Java开发

java.util.logging日志功能使用快速入门

2009-09-04 15:22 519 查看
摘自http://blog.csdn.net/dl88250/archive/2007/10/25/1843813.aspx

Java Logging API是sun公司于2002年5月正式发布的。它是自J2SE
1.4版本开始提供的一个新的应用程序接口。它能够很方便地控制和输出日志信息到文件,控制台或其它用户定义的地方,如数据库,电子邮件等。所以它是为最
终用户,系统管理员,软件服务工程师和开发人员提供的一种捕捉安全漏洞,检查配置正确性,跟踪调查系统运行瓶颈和调查系统运行错误的工具。

Java Logging API的设计目标是要:

1. 能够在运行时启动或关闭日志功能;

2. 能够非常精密地控制日志,即能够启动或关闭日志的某个个别功能;

3. 能够在运行时注册日志服务,当然也可以注册新的第三方日志服务;

4. 能够提供连接服务,使Java Logging API能与现存的日志系统(如操作系统的日志功能)连接;

5. 能够支持显示高优先度的信息给最终用户。

输出日志

由于Java Logging API提供了非常方便的接口,你可以在下面的例子里看到它的使用有多方便。

例1:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19


package

jdk14logger;

import

java.util.logging.Logger; // <= (1)

public

class

HelloLogWorld

{

private

static

String name = HelloLogWorld.class.getName();

private

static

Logger log = Logger.getLogger(name);// <= (2)

public

void

sub()

{

log.info("Hello Logging World"
);// <= (3)

}

public

static

void

main(String[] args)

{

HelloLogWorld logWorld = new

HelloLogWorld();

logWorld.sub();

}

}

说明:

1. Logger是Java Logging API中的一个类。在此之前,你必须确认你所使用的J2SE是1.4或更高版本。

2. Logger.getLogger方法创建了一个Logger实例。每一个Logger实例都必须有个名称,通常的做法是使用类名称定义Logger实例。后面还会讲到这样做的原因。

3. log.info方法用来输出日志信息。

执行例1你可以看到控制台上输出了日期时间,类名,方法名和Hello Logging World的信息。

输出的种类

Java Logging API提供了七个级别用来控制输出。这七个级别分别是:

SEVERE (最高级别)

WARNING

INFO

CONFIG

FINE

FINER

FINEST (最低级别)

与之对应,在Logger类中也为你预备好了这七个级别的输出方法。下面是使用这几种方法输出日志信息的例子。

例2:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

1920

21

22

23

24

25

26



package

jdk14logger;

import

java.util.logging.Logger;

public

class

LevelTest

{

private

static

String name = HelloLogWorld.class.getName();

private

static

Logger log = Logger.getLogger(name);

public

void

sub()

{

log.severe("severe level"
);// <= (1)

log.warning("warning level"
);// <= (2)

log.info("info level"
);// <= (3)

log.config("config level"
);// <= (4)

log.fine("fine level"
);// <= (5)

log.finer("finer level"
);// <= (6)

log.finest("finest level"
);// <= (7)

}

public

static

void

main(String[] args)

{

LevelTest test = new

LevelTest();

test.sub();

}

}

执行例2你可能看到控制台上只输出了(1)-(3)的信息,(4)-(7)的信息并没有如想象的那样被输出。这不要紧,继续看下面的内容你就知道原因了。

控制输出

上面例2中info以下的级别信息没有被输出是因为缺省日志输出级别的设置是info,也就是说只有info或它以上的级别被输出,它以下的级别不被输
出。通过变更设置可以使输出级别改变。变更输出级别的方法有两种,一是使用外部配置文件,二是使用程序编码。通常都是使用第一种方法。缺省的外部配置文件
是JRE中lib/logging.properties文件。你可以打开这个文件,修改以下两行为:

.level= ALL

java.util.logging.ConsoleHandler.level = ALL

修改完后,再运行一次例2,这次(1)-(7)的内容就都输出出来了。你可以修改输出级别为以下任何值,试一试输出有什么变化。

OFF

SEVERE

WARNING

INFO

CONFIG

FINE

FINER

FINEST

ALL

自定义的配置文件

如果你不想使用系统提供的缺省配置文件lib/logging.properties,那么也可以使用自己定义的配置文件。使用自定义配置文件的方法有很
多种,比较方便的方法是通过定义系统属性值java.util.logging.config.file来设置自定义配置文件。例如在执行例2时,使用下
面的命令:

java -Djava.util.logging.config.file=mylogging.properties LevelTest

其中mylogging.properties是你自定义的配置文件。如果需要,你还可以加上文件的路径名。

更多的输出控制

除了前面讲到的七个输出级别外,Logger类中还提供了以下三个便于程序员调试时使用的输出信息方法:

entering

exiting

throwing

它们是与FINER相同级别的输出,分别用于程序入口,出口和例外时的输出。除此之外Logger类中还准备了一些输出信息的方法,这些留待以后详细介绍。

输出内容的本地化

Java Logging API已经考虑到了国际化对应问题。在输出信息上你可以使用ResourceBundle提供本地化的输出信息。下面举个例子说明。

例3:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19


package

jdk14logger;

import

java.util.logging.Logger;

public

class

LocalTest {

private

static

String name = HelloLogWorld.class.getName();

private

static

Logger log = Logger.getLogger (name, "jdk14logger/LocalTest"
);<= (1)

public

void

sub() {

log.severe("level.severe"
);<= (2)

log.warning("level.warning"
);<= (3)

log.info("level.info"
);<= (4)

log.config("level.config"
);<= (5)

log.fine("level.fine"
);<= (6)

log.finer("level.finer"
);<= (7)

log.finest("level.finest"
);<= (8)

}

public

static

void

main(String[] args) {

LocalTest test = new

LocalTest();

test.sub();

}

}

你可以比较一下例2和例3。可以看到例3的Logger.getLogger
方法调用中增加了一个传参,并且(2)-(8)中的输出内容也改变了。(1)中增加的字符串传参就是使用ResourceBundle配置时的属性文件
名。下面就需要建立这个属性文件jdk14logger/LocalTest.properties,内容如下:

level.severe=severe level

level.warning=warning level

level.info=info level

level.config=config level

level.fine=fine level

level.finer=finer level

level.finest=finest level

现在运行例3可以看到输出结果并不是(2)-(8)中定义的内容。或许你已经想到了,(2)-(8)中定义的实际上是local.properties文
件中的属性键名,而输出是这些属性键名所对应的键值。那么或许你要问如果属性键名在属性文件中不存在怎么办,答案很简单,如果它不是属性键名就一定是要输
出的内容,所以就照原样输出了事。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: