简约设计の艺术

讨论软件制造过程中的艺术与工程,软件哲学

丁亮ID:DL88250
1393231次访问,排名12好友104人,关注者180
Linux、Java、C/C++,OpenSource热爱者,擅长JavaSE/JavaEE开发,熟悉JSF、EJB、Spring、JPA、OSGi等框架应用的架构,目前正在深入学习算法、OOAD、TDD以及敏捷实践。
DL88250的文章
原创 841 篇
翻译 9 篇
转载 161 篇
评论 695 篇
88250的公告





最近评论
DL88250:....
huoyuhan:谢谢
DL88250:: )
fy_kenny:
DL88250:为以后写书作点积累:)
文章分类
收藏
    相册
    Beyond
    壁纸收集
    动漫Kiss图图
    我的珍藏
    我的桌面
    CSDN专家Blog
    孟岩的专栏
    袁萌的专栏
    Ubuntu/Linux相关
    ChinaUnix
    Compiz Themes
    Compiz-Fusion
    deviantART Search
    GetDeb
    Gnome-Look
    KDE-Look
    LinuxToy
    Linux桌面中文网
    Ubuntu中文官方论坛
    Ubuntu桌面中文网
    代码示例
    C++代码示例
    HTML代码示例
    Java Code examples
    技术站点
    Apache Software
    CSDN
    Eclipse.org
    Extreme Programming
    hibernate.org
    IBM软件技术
    JavaFX Home
    JavaFX Script Reference
    JavaWorld@TW
    Java开源大全
    JBoss.org
    LEX & YACC Page
    NetBeans中文社区
    PHP 官方
    Ruby on Rails
    Ruby中文社区论坛
    SOURCEFORGE.NET
    Springframework.org
    Struts Framework
    Sun中国技术社区
    UML官方
    图书下载
    CSDN下载频道
    e 书时空
    IT e Book
    中华电脑书库
    中国 E 书网
    中国 IT 认证实验室
    中文电子书网
    偶要雷锋 - 分享社区
    我爱 e 书
    网络中国 - E 书
    网络上的博友
    吴杰博客
    老李的Blog
    我的偶像 :-)
    Alan Turing
    Bjarne Stroustrup's Homepage
    Don Knuth's Home Page
    Martin Fowler
    Richard Stallman's Home Page
    Uncle Bob (Robert C. Martin)
    我的朋友
    Eleven的专栏
    Eric.Gao的空间
    Meteor的专栏
    mmchsusan的主页
    solonote的专栏
    Vanessa的小窝
    ZhiBaoDeng的专栏
    zyofprogrammer的学习历程
    先知罗庄的专栏
    光光的Blog~
    师傅dorainm的Blog
    皮皮的空间
    秋歌的专栏
    金秋风采
    阿明的专栏
    存档
    订阅我的博客
    XML聚合  FeedSky

    原创 java.util.logging日志功能使用快速入门收藏

    新一篇: 什么是Web 2.0 | 旧一篇: 从SQL语言的分类谈COMMIT和ROLLBACK的用法

    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文 件中的属性键名,而输出是这些属性键名所对应的键值。那么或许你要问如果属性键名在属性文件中不存在怎么办,答案很简单,如果它不是属性键名就一定是要输 出的内容,所以就照原样输出了事。 

    发表于 @ 2007年10月25日 19:05:00|评论(loading...)|编辑

    新一篇: 什么是Web 2.0 | 旧一篇: 从SQL语言的分类谈COMMIT和ROLLBACK的用法

    评论

    #xinbgzs 发表于2008-07-25 11:12:54  IP: 121.18.86.*
    不支持中文的自定义错误吗?
    #DL88250 发表于2008-07-25 11:21:34  IP: 61.129.126.*
    To xinbgzs: 当然支持啊,给一下你的JDK版本。。。。
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 88250