ADFLogger记录日志和调试ADF业务组件

来源:互联网 发布:cimatrone11编程 编辑:程序博客网 时间:2024/04/29 21:47

一、基本知识

 

下面一段是摘自域于java.util.logging JDK说明文档中关于使用日志的四个主要目标:

  1. 由最终用户和系统管理员进行问题诊断。这由简单的常见问题日志组成,可在本地解决或跟踪这些问题,如资源不足、安全失败和简单的配置错误。
  2. 由现场服务工程师进行问题诊断。现场服务工程师使用的日志信息可以相当复杂和冗长,远超过系统管理员的要求。通常,这样的信息需要特定子系统中的额外日志记录。
  3. 由开发组织进行问题诊断。在现场出现问题时,必须将捕获的日志信息返回到原开发团队以供诊断。此日志信息可能非常详细,并且相当费解。这样的信息可能包括对特定子系统进行内部执行的详细跟踪。
  4. 由开发人员进行问题诊断。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也被启用了。

 

日志按严重性由高到低的顺序提供了如下的级别

  1. SEVERE 严重的错误,导致系统中止。期望这类信息能立即显示在状态控制台上
  2. WARNING 潜在问题的级别,它是不符合预期的状态但还不至于成为“错误”,例如使用了废弃的API等等。期望这类信息能立即显示在状态控制台上
  3. INFO 运行时产生的有意义的一些信息,主要用于报告消息的目的。期望这类信息能立即显示在状态控制台上
  4. CONFIG 静态配置消息,用来输出一些系统配置信息。期望这类信息仅被写入日志文件中
  5. FINE 指示提供跟踪信息,简单输出一些跟踪信息。期望这类信息仅被写入日志文件中
  6. FINER 指示提供一条相当详细的跟踪消息。期望这类信息仅被写入日志文件中
  7. FINEST 指示提供一条最详细的跟踪消息。期望这类信息仅被写入日志文件中

 

 

二、编写代码

 

在ADF代码中根据需求记录日志信息,确保日志信息在内容上和反应问题的严重程度上的准确而且恰当,是程序员需要做好的重要任务。

如下是在一个EO的实现类AfwkModulesVlEOImpl中记录日志信息的代码:

首先是创建一个日志记录器;然后输出日志信息。

 

?View Code JAVA
123
private static ADFLogger logger = ADFLogger.createADFLogger(AfwkModulesVlEOImpl.class);logger.log(Level.INFO,"select language_code, installed_flag from afwk_languages where installed_flag in ('I', 'B')");//logger.info("select language_code, installed_flag from afwk_languages where installed_flag in ('I', 'B')");

 

代码中记录日志信息可以采取两种办法:

  1. 使用log方法,通过指定Level参数来决定日志信息反映为哪个级别的严重程度。如上面代码中logger.log方法
  2. 使用日志级别的方法,什么严重程度的级别就使用什么样的输出方法。如上面代码中被注释掉的logger.info方法就是用来输出INFO级别的日志信息

 

日志记录方法划分为 5 个主要类别:

  1. 一系列的 "log" 方法,这种方法带有日志级别、消息字符串,以及可选的一些消息字符串参数。
  2. 一系列的 "logp" 方法(即 "log precise"),其与 "log" 方法相似,但是带有显式的源类名称和方法名称。
  3. 一系列的 "logrb" 方法(即 "log with resource bundle"),其与 "logp" 方法相似,但是带有显式的在本地化日志消息中使用的资源包名称。
  4. 还有跟踪方法条目("entering" 方法)、方法返回("exiting" 方法)和抛出异常("throwing" 方法)的便捷方法。
  5. 最后,还有一系列在非常简单的情况下(如开发人员只想为给定的日志级别记录一条简单的字符串)使用的便捷方法。这些方法按标准级别名称命名("severe"、"warning"、"info" 等等),并带有单个参数,即一个消息字符串。

 

如severe级别的方法有如下:

  1. severe(java.lang.String msg)
  2. severe(java.lang.String message, java.lang.Object param)
  3. severe(java.lang.String message, java.lang.Object[] params)
  4. severe(java.lang.String sourceClass, java.lang.String sourceMethod, java.lang.String msg)
  5. severe(java.lang.String sourceClass, java.lang.String sourceMethod, java.lang.String msg, java.lang.Object param1)
  6. severe(java.lang.String sourceClass, java.lang.String sourceMethod, java.lang.String msg, java.lang.Object[] params)
  7. severe(java.lang.String message, java.lang.Throwable t)
  8. severe(java.lang.Throwable t)

 

其它的方法和方法的详细信息可以查看Java Doc

 

 

三、调试程序

 

通过应用模块(Application Module)的上下文菜单选择Run或者Debug来测试运行业务组件,并根据实际组件进行数据操作:

 

obcb_test

 

操作之后查看Log Window的输出信息:

adflogger_log_window

 

注意上图中输出的日志信息:

1,绿色的日志信息属于系统运行输出的

2,红色字体的日志信息则是在程序代码中记录的。而红色的日志中,带日期时间、包名和方法的那行是我们程序中输出日志所属的上下文信息,

而以“信息:”打头的才是真正我们代码中输出的日志信息,如红色框所框住的信息就是第二部分示例代码所输出的日志信息。

 

注意:这种方式下,Log Window窗口中只输出消息级别高于INFO的日志信息,要查看低于这个级别的日志信息,需要配置ADFLogger的logging.xml文件

 

使用ADFLogger日志工具来进行程序的调试,这样避免了在程序中使用System.out.println方法来打印信息,也可以在产品交付的时候通过系统选项来控制

什么样级别的信息需要输出,而不是将任何程序的调试信息也一并输出。

 

如果我们希望除了看到程序中的日志信息,还希望查看一下运行时的诊断信息,可以启用诊断日志来输出相关信息。

在运行配置器的JVM选项中添加:

-Djbo.debugoutput=console

 

这样日志窗口中就会打印出很详细的诊断信息,主要包括

  1. 操作系统信息
  2. Java虚拟机信息
  3. 创建BindingContext信息
  4. 装载BC4J属性
  5. 创建数据库连接信息
  6. 创建业务实体信息

 

这样的信息可以帮助我们进行一些疑难杂症的解决。

 

在Oracle ADF应该开发过程中,JDeveloper 11g开发工具提供了很多的调试方式和工具,随着后续学习的深入,将记录更多的调试方法。



前面的文章记录了怎么使用ADFLogger日志记录器来记录和调试业务组件,但是在ADF应用开发中,很多代码是无法通过业务组件浏览器来进行测试的,

如控制层的代码,因此就无法通过前面介绍的方法来进行调试。

 

代码中使用ADFLogger来记录日志信息后,需要做如下的配置才可以将日志信息输出到JDeveloper控制台或者日志文件:

 

1,查找logging.xml文件的路径,logging.xml文件的位置找起来稍微有点麻烦

 

如果设置了环境变量JDEV_HOME,在JDEV_HOME目录下面会有一个system<version>的文件夹,如system11.1.1.0.31.51.56

如果没有设置环境变量JDEV_HOME,在JDeveloper的安装目录下有一个sytem/system<version>的文件夹,如system/system11.1.1.0.31.51.56

在system<version>目录下的DefaultDomain\config下就有是logging.xml文件了

 

2,修改logging.xml文件内容,配置哪些java 包中的日志信息需要打印

在此文件中配置哪些java包什么级别的日志信息将被打印,如下例子:

?View Code XML
1
 

 

<logger name="oracleseeker.demo" level="INFO"/> 代表java包oracleseeker.demo中的级别高于INFO的日志信息都将被输出

<logger name="oracleseeker.sample" level="WARNING"/> 代码java包oracleseeker.sample中级别高于WARNING的日志信息将被输出

按照上面的语法,可以将自己开发的java包添加进去,当然最简单的一种方式是开启所有java包的日志,这是一种简便的方式,但不推荐使用。

<logger name="" level="WARNING"> 这样的就是将所有包的日志都打印出来

 

如果想输出ADF标准模块中的日志信息,可以添加如下的项即可

?View Code XML
1
 

 

 

3,添加运行配置器的JVM选项

 

运行配置器的JVM选项中添加如下的选项

-Djbo.debugoutput=adflogger -Djbo.adflogger.level=FINE

添加了这个选项之后,JDeveloper控制台中也会打印出日志信息,如果希望将日志信息输出到一个日志文件,可以配置logging.xml文件,添加 log_handler 来输出重定向,具体可以看上面给出的示例


0 0
原创粉丝点击