Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1967015
  • 博文数量: 606
  • 博客积分: 9991
  • 博客等级: 中将
  • 技术积分: 5725
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-17 19:07
文章分类

全部博文(606)

文章存档

2011年(10)

2010年(67)

2009年(155)

2008年(386)

分类:

2008-07-31 12:50:08

软件包 java.util.logging 的描述
提供 JavaTM 2 平台核心日志工具的类和接口。Logging API 的中心目标是支持在客户站点进行软件的维护和服务。
此包的关键元素包括:

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

LogRecord:用于在 logging 框架和单独的日志处理程序之间传递 logging 请求。

Handler:将 LogRecord 对象导出到各种目的地,包括内存、输出流、控制台、文件和套接字。为此有各种的 Handler 子类。其他 Handler 可能由第三方开发并在核心平台的顶层实现。

Level:定义一组可以用来控制 logging 输出的标准 logging 级别。可以配置程序为某些级别输出 logging,而同时忽略其他输出。

Filter:为所记录的日志提供日志级别控制以外的细粒度控制。Logging API 支持通用的过滤器机制,该机制允许应用程序代码附加任意的过滤器以控制 logging 输出。

Formatter:为格式化 LogRecord 对象提供支持。此包包括的两个格式化程序 SimpleFormatter 和 XMLFormatter 分别用于格式化纯文本或 XML 中的日志记录。与 Handler 一样,其他 Formatter 可能由第三方开发。

Logging API 提供静态和动态的配置控制。静态控制使现场服务人员可以建立特定的配置,然后重新启动带有新 logging 设置的应用程序。动态控制允许对当前正在运行的系统内的 logging 配置进行更新。API 也允许对不同的系统功能领域启用或禁用 logging。例如,现场服务工程师可能对跟踪所有 AWT 事件感兴趣,但是不会对套接字事件或内存管理感兴趣。


Null 指针

通常,除非在 javadoc 中另行注释,否则如果传递一个 null 参数,则方法和构造方法将抛出 NullPointerException。此规则的一个明显的例外是 Logger 类中的各种日志记录便捷方法(config、entering、exiting、fine、finer、finest、log、logp、logrb、severe、throwing 和 warning 方法)的所有参数,除了初始 Level 参数(如果有)之外,都接受 null 值。
 
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
19
20
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文 件中的属性键名,而输出是这些属性键名所对应的键值。那么或许你要问如果属性键名在属性文件中不存在怎么办,答案很简单,如果它不是属性键名就一定是要输 出的内容,所以就照原样输出了事。 
 

1.在程序里面写死需要哪些log级别,使用哪些subscribe

import java.util.logging.*;
public class LoggingProgramSetPubSubpro
{
 public static void main(String[] args)
 {
  Logger logger = Logger.getLogger("loggingTest");
  logger.setLevel(Level.INFO);//这个设定最重要
  
  ConsoleHandler consoleHandler = new ConsoleHandler();
  consoleHandler.setLevel(Level.OFF);//这个好像不起作用
  
  logger.addHandler(consoleHandler);
  
  logger.severe("嚴重訊息");
  logger.warning("警示訊息");
  logger.info("一般訊息");
  logger.config("設定方面的訊息");
  logger.fine("細微的訊息");
  logger.finer("更細微的訊息");
  logger.finest("最細微的訊息");
 }
}

2.如何在配置文件里面改,好处是不用重新编译原文件

import java.util.logging.*;
/**

说明:我们可以在C:\Documents and Settings\yay目录下面找到java0.log文件
 它是一个xml格式的,
 我们可以在${jdk}\jar\lib下面找到logging.properties文件,你可以在这里面修改

 

*/
public class LoggingPropertiesFile
 {
  public static void main(String[] args)
   {

    Logger logger = Logger.getLogger("loggingTest");
    logger.severe("严重的信息");
    logger.warning("警告信息");
    logger.info("一般信息");
    logger.config("设定方面的信息");
    logger.fine("细微的信息");
    logger.finer("更细微的信息");
    logger.finest("最细微的信息");
    

   }
 }

3.使用log方法,使用自定义的Formatter

import java.util.logging.*;
/**

輸出格式是由java.util.logging.Formatter决定的
注意这里说得这个Formatter是属于哪里包里面的,不要搞混了

*/
public class LoggingLogMethod
{
 public static void main(String[] args)
 {
  Logger logger = Logger.getLogger("loggingTest");
  logger.setLevel(Level.ALL);
  
  ConsoleHandler consoleHandler = new ConsoleHandler();
  consoleHandler.setLevel(Level.ALL);
  
  logger.addHandler(consoleHandler);
  
  try
  {
   //%h代表用户主目录
   //%g代表自动编号
   FileHandler  fileHandler=new FileHandler("%h/loggingHome%g.log");
   fileHandler.setLevel(Level.ALL);
   fileHandler.setFormatter(new YAYFormatter());
   
   
   logger.addHandler(fileHandler);
  }
  catch (Exception e)
  {
   e.printStackTrace();
  }
  
  
  
  logger.log(Level.SEVERE, "嚴重訊息");
  logger.log(Level.WARNING, "警示訊息");
  logger.log(Level.CONFIG, "一般訊息");
  logger.log(Level.CONFIG, "設定方面的訊息");
  logger.log(Level.FINE, "細微的訊息");
  logger.log(Level.FINER, "更細微的訊息");
  logger.log(Level.FINEST, "最細微的訊息");
 }
}

4.如何自定义java.util.logging.Formatter

import java.util.logging.*;
public class YAYFormatter extends Formatter
{
 public String format(LogRecord logRecord)
 {
  return  "LogRecord info: " + logRecord.getSourceClassName() +//就是哪个类里面用的了你
   "\n" +"Level\t|\tLoggerName\t|\tMessage\t|\n" +
  logRecord.getLevel() + //是SEVERE还是WARNING还是别的
    "\t|\t" +
   logRecord.getLoggerName() +//这个logger发布者
     "\t|\t" +
   logRecord.getMessage() + //消息内容
      "\t|\n\n";   
 }
}

 
 
http://blog.csdn.net/dl88250/archive
阅读(2423) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~