java Logger 的使用与配置2

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

Java  Logging  API的设计目标是要:
1.  能够在运行时打开或关闭日志功能;
    2.  能够非常精密地控制日志,即能够打开或关闭日志的某个个别功能;
    3.  能够在运行时注册日志服务,当然也可以注册新的第三方日志服务;
    4.  能够提供连接服务,使Java  Logging  API能与现存的日志系统(如操作系统的日志功能)连接;
    5.  能够支持显示高优先度的信息给最终用户。

输出日志
由于Java  Logging  API提供了非常方便的接口,你可以在下面的例子里看到它的使用有多方便。
例1:
[java]  view plain copy
  1. import java.util.logging.Logger;     // <= (1)  
  2. public class HelloLogWorld {  
  3.   private static String name = HelloLogWorld.class.getName();    // <= (2)  
  4.   private static Logger log = Logger.getLogger(name);  
  5.   public void sub() {  
  6.     log.info("Hello Logging World");    // <= (3)  
  7.   }  
  8.   public static void main(String[] args) {  
  9.     HelloLogWorld logWorld = new HelloLogWorld();  
  10.     logWorld.sub();  
  11.   }  
  12. }  


说明:
    (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:
[java]  view plain copy
  1. import java.util.logging.Logger;  
  2. public class LevelTest {  
  3.     private static String name = HelloLogWorld.class.getName();  
  4.     private static Logger log = Logger.getLogger(name);  
  5.     public void sub() {  
  6.         log.severe("severe level");        // <= (1)  
  7.         log.warning("warning level");    // <= (2)  
  8.         log.info("info level");            // <= (3)  
  9.         log.config("config level");        // <= (4)  
  10.         log.fine("fine level");            // <= (5)  
  11.         log.finer("finer level");            // <= (6)  
  12.         log.finest("finest level");        // <= (7)  
  13.     }  
  14.     public static void main(String[] args) {  
  15.         LevelTest test = new LevelTest();  
  16.         test.sub();  
  17.     }  
  18. }  



执行例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:
[java]  view plain copy
  1. import java.util.logging.Logger;  
  2.   
  3. public class LocalTest {  
  4.     private static String name = HelloLogWorld.class.getName();  
  5.     private static Logger log = Logger.getLogger (name, "local");        <= (1)  
  6.     public void sub() {  
  7.         log.severe("level.severe");        <= (2)  
  8.         log.warning("level.warning");    <= (3)  
  9.         log.info("level.info");            <= (4)  
  10.         log.config("level.config");        <= (5)  
  11.         log.fine("level.fine");            <= (6)  
  12.         log.finer("level.finer");            <= (7)  
  13.         log.finest("level.finest");        <= (8)  
  14.     }  
  15.     public static void main(String[] args) {  
  16.         LocalTest test = new LocalTest();  
  17.         test.sub();  
  18.     }  
  19. }  


你可以比较一下例2和例3。可以看到例3的Logger.getLogger  方法调用中增加了一个传参,并且(2)-(8)中的输出内容也改变了。(1)中增加的字符串传参就是使用ResourceBundle配置时的属性文件名。下面就需要建立这个属性文件local.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文件中的属性键名,而输出是这些属性键名所对应的键值。那么或许你要问如果属性键名在属性文件中不存在怎么办,答案很简单,如果它不是属性键名就一定是要输出的内容,所以就照原样输出了事。

Level.SEVERE: 严重信息

Level.WARNING: 警告信息
Level.INFO:一般信息
Level.CONFIG:设定方面的信息
Level.FINE:细微的信息
Level.FINER:更细微的信息
Level.FINEST:最细微的信息


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值