免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1019 | 回复: 0
打印 上一主题 下一主题

Java Logging API(二) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-28 16:27 |只看该作者 |倒序浏览

二、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对象可以通过调用工厂方法getLogger或getAnonymousLogger获取。

//获取一个名为“A”的Logger对象
Logger loggerA= Logger.getLogger(“A”);
// 获取一个名为“A.B”的Logger对象,其上级记录器为loggerA。
Logger loggerAB= Logger.getLogger(“A.B”);
//获取一个匿名Logger对象
Logger loggerTmp = Logger.getAnonymousLogger();

对非匿名Logger,getLogger先在命名空间中查找同名的Logger对象,如果有,则返回该Logger对象;如果不存在,则在命名空间中创建注册一个新的Logger对象,并与其上级Logger对象相关联。
匿名Logger对象属于创建它的对象的私有对象,只能由创建它的对象使用,记录一些临时性的日志信息。而命名Logger对象是全局性的,在日志框架的生存期内,除了创建它的对象外还可由其它对象用于记录日志信息。
匿名的Logger对象由一个全局的root Logger “” 对象(root Logger的名字为空)。这意味着所有匿名Logger对象将从root Logger “”中继承行为。
匿名Logger对象通常用于java Applet应用中。它去掉了在运行过程中的一般性的安全检查,允许其创建类对象对Logger的控制、状态信息进行修改,如:setLevel设置Logger的日志消息记录级别;addHandle增加Logger的Handle(处理器)对象等。
一个Logger对象可以拥有零个到多个Handler实例。当没有Handler时,如不禁止日志记录沿名字空间向上传递,那该Logger对象的日志消息记录将由其拥有Handler实例的上级Logger进行处理。当一个Logger对象拥有多个Handler实例对象时,其记录的日志数据将被所有的Handler逐一进行处理。
(三)、Handler
Handler对象接收传来的日志消息将其输出。Handler可以把日志消息输出到多种目标资源,如:输出到控制台进行显示、写入日志文件、传送到网络上的远程日志服务进行处理、写入系统日志等任何物理资源。
Handler对象在创建时使用LogManager对象的相关属性的默认值(如Handler的Filter、Formatter、Level等对象属性)进行初始化。
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
                         //在MemoryHandler中缓存日志记录
                            mt.logger.log(Level.INFO,"日志记录"+i);
                            if (i==trigger) {
                            //触发事件成立,显式调用MemoryHandler的
//push方法触发目标Handler输出日志记录到
//my.log文件中
                                     mt.mhandler.push();
                                     break;
                            }
                   }
         }
}
                                                                              实例2

2、FileHandler 文件处理器。
StreamHandler流处理器将日志记录以流的形式输出。FileHandler、ConsoleHandlerSocketHandler为StreamHandler的子类。
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) {
}



本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/31901/showart_288195.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP