Chinaunix首页 | 论坛 | 博客
  • 博客访问: 98891
  • 博文数量: 26
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 280
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-14 13:33
文章分类

全部博文(26)

文章存档

2008年(8)

2007年(18)

我的朋友

分类: Java

2007-04-28 16:27:52

二、Java Logging API

          

(一)、该软件包中的关键类。

Logger:  应用程序进行日志记录调用的主要实体。 Logger对象用于记录特定系统或应用程序的消息。

LogRecord:  用于在日志框架和单个记录处理程序之间传递记录请求。

Handler:  日志数据的最终输出处理器。它将LogRecord对象导出到各种目标,包括内存、输出流、控制台、文件和套接字。多种 Handler子类可供用于这种用途。

Level:  定义一组标准的记录级别,可用于控制记录的输出。可以把程序配置为只输出某些级别的记录,而忽略其他级别的输出。

Filter:  精细过滤、控制记录的内容,比记录级别所提供的控制准确得多。记录API支持通用的过滤器机制,这种机制允许应用程序代码添加任意过滤器以便控制记录的输出。

Formatter:  LogRecord对象的格式化提供支持。

LogManager: Java Logging框架中唯一的、全局的对象,用于维护与Logger记录器及日志服务的一系列共享的数据结构及状态。它负责整个日志框架的初始化、维护一组全局性的Handle对象、维护一个树形结构的Logger的名字空间、诊测日志框架配置文件的改变从而重新读入并应用相关的参数以及负责程序停止运行时整个日志框架的清理工作。

(二)Logger

1Logger的命名空间

SimpleLoggingTest.java实例中,我们使用了一个匿名的(没有命名的)Logger对象。在Java Logging 框架中,Logger是可以命名的。Logger的名字空间与java类的名字空间的结构相同:使用“.”间隔的字符串。Logger的名字空间体现了Logger的层次结构。例如:命名为“a.b”Logger是命名为“a.b.c”(上一级)Logger记录器。Logger的命名可以是任意的字符串,一般情况下,使用包或类的名字为Logger 进行命名。

Logger的名字空间由全局单列类LogManager的实例进行创建、维护。

匿名Logger不被存储在命名空间中。

2创建Logger实例

Logger对象可以通过调用工厂方法getLoggergetAnonymousLogger获取。

 

//获取一个名为“A”Logger对象

Logger loggerA= Logger.getLogger(“A”);

// 获取一个名为“A.B”Logger对象,其上级记录器为loggerA

Logger loggerAB= Logger.getLogger(“A.B”);

//获取一个匿名Logger对象

Logger loggerTmp = Logger.getAnonymousLogger();

 

对非匿名LoggergetLogger先在命名空间中查找同名的Logger对象,如果有,则返回该Logger对象;如果不存在,则在命名空间中创建注册一个新的Logger对象,并与其上级Logger对象相关联。

匿名Logger对象属于创建它的对象的私有对象,只能由创建它的对象使用,记录一些临时性的日志信息。而命名Logger对象是全局性的,在日志框架的生存期内,除了创建它的对象外还可由其它对象用于记录日志信息。

匿名的Logger对象由一个全局的root Logger “” 对象(root Logger的名字为空)。这意味着所有匿名Logger对象将从root Logger “”中继承行为。

匿名Logger对象通常用于java Applet应用中。它去掉了在运行过程中的一般性的安全检查,允许其创建类对象对Logger的控制、状态信息进行修改,如:setLevel设置Logger的日志消息记录级别;addHandle增加LoggerHandle(处理器)对象等。

一个Logger对象可以拥有零个到多个Handler实例。当没有Handler时,如不禁止日志记录沿名字空间向上传递,那该Logger对象的日志消息记录将由其拥有Handler实例的上级Logger进行处理。当一个Logger对象拥有多个Handler实例对象时,其记录的日志数据将被所有的Handler逐一进行处理。

(三)、Handler

 Handler对象接收传来的日志消息将其输出。Handler可以把日志消息输出到多种目标资源,如:输出到控制台进行显示、写入日志文件、传送到网络上的远程日志服务进行处理、写入系统日志等任何物理资源。


Handler对象在创建时使用LogManager对象的相关属性的默认值(如HandlerFilterFormatterLevel等对象属性)进行初始化。

Handler对象可通过调用setLevel(Level.OFF)暂停工作;通过调用setLevel设置适当的记录日志消息级别恢复工作。

Handler是一个抽象类。

1      MemoryHandler

 Handler的子类,在内存中的一个循环缓冲区用于缓存日志记录请求。通常MemoryHandler只简单的把传入的LogRecords存储到它的内存中。这种缓存的开销非常低廉,它去掉了格式化所产生的系统消耗。当某个触发条件满足时,MemoryHandler将其缓冲的数据push(发布)到目标Handler,由后者执行实际的输出。有三种模式触发MemoryHandler进行push操作:a、传入的LogRecords的级别高于MemoryHandler预先定义的push级别;b、有其他对象显式的调用其push方法;c、其子类重载了log方法,逐一检索每个传入的LogRecords,若符合特定的标准则进行push操作。

实例:假设我们需要跟踪一个生产环境中的一个很少出现的Bug。在大多数场合,系统化产生大量的日志记录,而我们仅只关心记录中最近的几条,那么我们只需要使用MemoryHandler对日志记录进行缓存,当且仅当某个事件发生时将最近的几条记录从内存中 dump到制定的文件中。

//MemoryHandlerTest.java

import java.util.logging.*;

import java.io.*;

public class MemoryHandlerTest {

         FileHandler fhandler;

         Logger logger;

         MemoryHandler mhandler;

        

         MemoryHandlerTest() {

                   try {

                            //构造名为my.log的日志记录文件

                       fhandler = new FileHandler("my.log");

                 int numRec = 5;

                 //构造一个5个日志记录的MemoryHandler

//其目标Handler为一个FileHandler

                 mhandler = new MemoryHandler (fhandler, numRec, Level.OFF) ;

            //构造一个记录器

            logger = Logger.getLogger("com.mycompany");

            //为记录器添加一个MemoryHandler

                 logger.addHandler(mhandler);

 

             } catch (IOException e) {

             }

         }

         public static void main(String args[]) {

                   MemoryHandlerTest mt = new MemoryHandlerTest();

                   int trigger = (int)(Math.random()*100);

               for (int i=1;i<100;i++) {

                         //MemoryHandler中缓存日志记录

                            mt.logger.log(Level.INFO,"日志记录"+i);

                            if (i==trigger) {

                            //触发事件成立,显式调用MemoryHandler

//push方法触发目标Handler输出日志记录到

//my.log文件中

                                     mt.mhandler.push();

                                     break;

                            }

                   }

         }

}

                                                                              实例2

 

2FileHandler 文件处理器。

StreamHandler流处理器将日志记录以流的形式输出。FileHandlerConsoleHandlerSocketHandlerStreamHandler的子类。

ConsoleHandler将日志记录输出到控制终端。前面的实例(实例2除外)都将日记记录数据输出到控制台。

FileHandler将日志记录输出到特定的文件,或循环的几个日志文件中。日志文件可以设置容量大小。当日志文件达到限定的容量时将被自动清空,重头开始写入新的日志记录数据。

例:创建一个容量为1Mb的文件处理器

int limit = 1000000; // 1 Mb

    FileHandler fh = new FileHandler("my.log", limit, 1);

 

对于循环的日志文件,每个文件将被指定容量限制。当当前的日志文件的长度达到指定值后该文件被关闭,新的日志文件被创建,旧的文件将在文件名模板后追加序号。如此产生多个顺序编号的日志记录文件。

例:

try {

// 创建一个拥有3个日志文件,每个容量为1Mb的文件处理器

String pattern = "my%g.log";

    int limit = 1000000; // 1 Mb

    int numLogFiles = 3;

    FileHandler fh = new FileHandler(pattern, limit, numLogFiles);

       

} catch (IOException e) {

}

 

阅读(1417) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~