使用api的步骤
JDK 1.4中引入的日志API,能够捕获很多错误信息,比如:设置错误、性能瓶颈、安全破坏、程序或平台小问题等。这些API提供的日志非常适用于各种不同使用者的分析,包括:外出服务工程师,软件开发人员,参与客户管理和维护的系统管理员。日志的定义
|
日志是一个记录信息的系统化方法,它应该具有如下的特点:
-
简单,需要最简单的手段就可以将信息输入到原始程序。
-
可追踪,需要最小的能力就可以理解。
-
可维护,当程序更改时,需要最小的能力就可以更改信息。
很多开发人员都习惯使用System.err.println函数来显示调试信息。这一方法简单吗?是的。可追踪吗?不见得,除非你可以定义这一函数显示和保存详细的信息。可维护吗?可以明确地说,这是不可能的。和System.out.println or fout.println一样,使用其他方法,如OutputStream 对象也是非常的麻烦。
JDK 1.4中的日志API提供了面向对象的具有日志功能的界面,它具有简单,可追踪,可维护的错误诊断特点,适用于从终端用户到开发人员的不同用户。表A列举了日志API的关键原理。
表 A | |
类名称 | 描述 |
Logger | 用于构成日志调用的主体 |
LogRecord | 用于在日志框架和独立日志处理器对象之间传递日志请求 |
Handler | 用于输出LogRecord对象到不同的输出类型,比如OutputStream 和文件 |
Level | 定义一个事先调整的日志级别,用于控制日志的输出 |
Filter | 提供了能控制记录日志的方法 |
Formatter | 一个Formatter对象支持格式化LogRecord对象 |
|
既然我们已经知道日志API函数的概貌,现在让我们看看这些函数的基本实际应用。在运行源代码之前,请记得添加如下的声明,这些声明包括日志API的封装。
importjava.util.logging.*;
正如前面提到的那样,一个日志记录器对象的任务是生成日志消息。你可以使用以下的声明来构建一个日志记录器对象:
static Logger theLogger = Logger.getLogger(LoggingTest.class.getName());
以上的声明使用一个名为getLogger的方法来构建或查找一个日志记录器theLogger对象。每一个日志记录器对象包含一个识别唯一记录器的名称。如果一个现成的日志记录器已经使用一个名称,则返回的是一个现成的对象,否则将构建一个新的对象。记录器名称将用于在LoggerManager中注册记录器对象。
在很多情况下,比如在一个applet程序,使用一个注册记录器是不太方便的,因为这会使安全检测复杂化。你可以使用一个无称号的日志记录器,所以applet程序能够更新日志的状态。你可以使用以下的代码构建一个无符号日志对象:
static Logger theLogger = Logger. getAnonymousLogger();
以下的声明将显示一个日志消息:
theLogger.info("Hello logging!");
与System.err.println不同,这一声明能够记录比文本消息更多的信息。声明有如下的输出:
2003/2/27
Info: Hello logging!
日志记录器对象能够记录日志日期,时间,调用类,调用方法,日志级别,以及文本消息。以前要输出如此详细的信息必须编写很多行代码,但现在的日志记录器简化了这一过程。
在上面的范例中,INFO方法用于输出日志消息,很多方法都可以用于输出日志消息,但是INFO方法特别地用于输出一个INFO级别的日志消息。
级别
与System.err.println不同,一个日志记录器对象不会立即输出所有信息,这一设置可以避免输出非重要数据而陷入通用语言运行时间的困境。为了决定在一定时间内输出哪一类消息,一个类级别应该用来限制记录的日志。表B提供了记录日志的定义了的级别列表。
表 B | |||
级别 | 重要性 | 日志记录器相应的日志方法 | 级别数值 |
SEVERE | 非常重要 | severe(String message); | 1000 |
WARNING | 针对警告 | warning(String message); | 900 |
INFO | 信息化的运行时间消息 | info(String message); | 800 |
CONFIG | 静态设置的消息 | config(String message); | 700 |
FINE | 提供追踪信息 | fine(String message); | 500 |
FINER | 显示详细的追踪信息 | finer(String message); | 400 |
FINEST | 更详细的追踪信息 | finest(String message); | 300 |
ALL | 显示所有应该日志记录的信息 | 没有可应用的 | Integer.MIN_VALUE |
OFF | 关闭日志 | 没有可应用的 | Integer.MAX_VALUE |
请注意前面七个级别都是限制日志记录,后面两个级别用于日志的使用和关闭。
|
日志可以以两种方式进行级别限制。第一种方式是使用预定义好的函数,如上面范例所示。另一方式是使用带有级别对象的方法,例如,如果你想要在一个CONFIG级别记录一条消息,可以使用如下的代码:
theLogger.config(“Hello Logging!”);
或者
theLogger.log(Level.CONFIG, “Hello Logging!”);
处理程序
以上范例的输出都是面向控制台,但是日志API也提供输出目标的另一种方式,即处理程序对象。
下面两行代码构建了一个用于myLogger.txt文件的处理程序,并在日志记录器对象theLogger中插入处理程序:
FileHandler h = new FileHandler("./myLogger.txt");
theLogger.addHandler(h);
这两行代码运行之后,控制台会出现一个日志信息,这和文件myLogger.txt内部的执行效果是一样的。
表C提供了可行使用的处理程序类的列表。
表 C | |
处理程序 | 用途 |
StreamHandler | 写一个格式化的记录到an OutputStream |
ConsoleHandler | 写一个格式化的记录到System.err |
FileHandler | 定格式化日志记录到一个单一文件或到多个日志文件 |
SocketHandler | 写格式化记录到远程TCP端口 |
MemoryHandler | 在内存中存储日志记录 |
可以看到,输出目标范围可以从文件控制台到网络,处理器不仅能够控制日志信息的目的地,而且还可以控制输出格式,这也需要格式程序的帮助。
格式程序
|
格式程序用于定义日志输出的规划。JDK 1.4提供了两种格式程序:SimpleFormatter and XMLFormatter。前者显示了如前面所示的规划,后者构建的规划是以一个XML格式。以下代码段将日志消息以XML格式输出到一个文本文件,所下所示:
FileHandler h = new FileHandler("./myLogger.txt");
theLogger.addHandler(h);
h.setFormatter(new XMLFormatter());
每一个处理程序对象通常包含一个格式程序对象。在以上范例中,调用theLogger.info(“Hello Logging!”)之后,文本文件myLogger.txt将包含如下的内容:
因为XML规划可以由通用XML剖析器读取和处理,你可以利用以上的XML文件和XML剖析器程序重构一个新的格式程序。
坚守核心技术
在本文中,我们供提了JDK 1.4中日志API的一个基本概貌,并着重介绍了日志记录器、级别、处理程序、格式程序对象等。这些对象都是最基本的使用工具,在使用日志功能之前必须很好地理解它们。
然而,日志API提供了超乎这些基本功能的复杂级别。例如,你可以利用特定程序功能开发自己的级别,处理程序,格式对象。其他一些更先进的概念,比如使用过滤器来控制日志选项,在运行程序中使用动态设置更新,使用LogManager来跟踪全局日志信息。
你应该考虑掌握这些核心技术,因为这些更先进的功能在日志API的新版本中作用更大。
本文地址:http://www.45fan.com/dnjc/71543.html