一、基本知识
下面一段是摘自域于java.util.logging JDK说明文档中关于使用日志的四个主要目标:
- 由最终用户和系统管理员进行问题诊断。这由简单的常见问题日志组成,可在本地解决或跟踪这些问题,如资源不足、安全失败和简单的配置错误。
- 由现场服务工程师进行问题诊断。现场服务工程师使用的日志信息可以相当复杂和冗长,远超过系统管理员的要求。通常,这样的信息需要特定子系统中的额外日志记录。
- 由开发组织进行问题诊断。在现场出现问题时,必须将捕获的日志信息返回到原开发团队以供诊断。此日志信息可能非常详细,并且相当费解。这样的信息可能包括对特定子系统进行内部执行的详细跟踪。
- 由开发人员进行问题诊断。Logging API 还可以用来帮助调试正在开发的应用程序。这可能包括由目标应用程序产生的日志信息,以及由低级别的库产生的日志信息。但是要注意,虽然这样使用非常合理,但是 Logging API 并不用于代替开发环境中已经存在的调试和解析工具
本文主要基于第四点来描述如何利用JDeveloper 11g和ADFLogger来调试ADF应用中的业务组件。ADFLogger是ADF基于Java Logging API (java.util.logging.Logger)包装的日志工具。
java.util.logging.Level类中定义了一组可用来控制日志输出的标准日志级别。日志 Level 对象是有序的,并且是通过有序的整数来指定。
在给定的级别上启用日志记录也就启用了所有较高级别的日志记录,如下面的级别中,如果启用了INFO级别,那更高级别的SEVERE和WARNING也被启用了。
日志按严重性由高到低的顺序提供了如下的级别
- SEVERE 严重的错误,导致系统中止。期望这类信息能立即显示在状态控制台上
- WARNING 潜在问题的级别,它是不符合预期的状态但还不至于成为“错误”,例如使用了废弃的API等等。期望这类信息能立即显示在状态控制台上
- INFO 运行时产生的有意义的一些信息,主要用于报告消息的目的。期望这类信息能立即显示在状态控制台上
- CONFIG 静态配置消息,用来输出一些系统配置信息。期望这类信息仅被写入日志文件中
- FINE 指示提供跟踪信息,简单输出一些跟踪信息。期望这类信息仅被写入日志文件中
- FINER 指示提供一条相当详细的跟踪消息。期望这类信息仅被写入日志文件中
- FINEST 指示提供一条最详细的跟踪消息。期望这类信息仅被写入日志文件中
二、编写代码
在ADF代码中根据需求记录日志信息,确保日志信息在内容上和反应问题的严重程度上的准确而且恰当,是程序员需要做好的重要任务。
如下是在一个EO的实现类AfwkModulesVlEOImpl中记录日志信息的代码:
首先是创建一个日志记录器;然后输出日志信息。
代码中记录日志信息可以采取两种办法:
- 使用log方法,通过指定Level参数来决定日志信息反映为哪个级别的严重程度。如上面代码中logger.log方法
- 使用日志级别的方法,什么严重程度的级别就使用什么样的输出方法。如上面代码中被注释掉的logger.info方法就是用来输出INFO级别的日志信息
日志记录方法划分为 5 个主要类别:
- 一系列的 "log" 方法,这种方法带有日志级别、消息字符串,以及可选的一些消息字符串参数。
- 一系列的 "logp" 方法(即 "log precise"),其与 "log" 方法相似,但是带有显式的源类名称和方法名称。
- 一系列的 "logrb" 方法(即 "log with resource bundle"),其与 "logp" 方法相似,但是带有显式的在本地化日志消息中使用的资源包名称。
- 还有跟踪方法条目("entering" 方法)、方法返回("exiting" 方法)和抛出异常("throwing" 方法)的便捷方法。
- 最后,还有一系列在非常简单的情况下(如开发人员只想为给定的日志级别记录一条简单的字符串)使用的便捷方法。这些方法按标准级别名称命名("severe"、"warning"、"info" 等等),并带有单个参数,即一个消息字符串。
如severe级别的方法有如下:
- severe(java.lang.String msg)
- severe(java.lang.String message, java.lang.Object param)
- severe(java.lang.String message, java.lang.Object[] params)
- severe(java.lang.String sourceClass, java.lang.String sourceMethod, java.lang.String msg)
- severe(java.lang.String sourceClass, java.lang.String sourceMethod, java.lang.String msg, java.lang.Object param1)
- severe(java.lang.String sourceClass, java.lang.String sourceMethod, java.lang.String msg, java.lang.Object[] params)
- severe(java.lang.String message, java.lang.Throwable t)
- severe(java.lang.Throwable t)
其它的方法和方法的详细信息可以查看Java Doc
三、调试程序
通过应用模块(Application Module)的上下文菜单选择Run或者Debug来测试运行业务组件,并根据实际组件进行数据操作:
操作之后查看Log Window的输出信息:
注意上图中输出的日志信息:
1,绿色的日志信息属于系统运行输出的
2,红色字体的日志信息则是在程序代码中记录的。而红色的日志中,带日期时间、包名和方法的那行是我们程序中输出日志所属的上下文信息,
而以“信息:”打头的才是真正我们代码中输出的日志信息,如红色框所框住的信息就是第二部分示例代码所输出的日志信息。
注意:这种方式下,Log Window窗口中只输出消息级别高于INFO的日志信息,要查看低于这个级别的日志信息,需要配置ADFLogger的logging.xml文件
使用ADFLogger日志工具来进行程序的调试,这样避免了在程序中使用System.out.println方法来打印信息,也可以在产品交付的时候通过系统选项来控制
什么样级别的信息需要输出,而不是将任何程序的调试信息也一并输出。
如果我们希望除了看到程序中的日志信息,还希望查看一下运行时的诊断信息,可以启用诊断日志来输出相关信息。
在运行配置器的JVM选项中添加:
-Djbo.debugoutput=console
这样日志窗口中就会打印出很详细的诊断信息,主要包括
- 操作系统信息
- Java虚拟机信息
- 创建BindingContext信息
- 装载BC4J属性
- 创建数据库连接信息
- 创建业务实体信息
这样的信息可以帮助我们进行一些疑难杂症的解决。
在Oracle ADF应该开发过程中,JDeveloper 11g开发工具提供了很多的调试方式和工具,随着后续学习的深入,将记录更多的调试方法。
本文转自Oracle Seeker:http://oracleseeker.com/2008/11/20/debugging_adf_business_component_by_adflogger/