网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  web service appender 管理日志纪录     
  文章作者:未知  文章来源:水木森林  
  查看:106次  录入:管理员--2007-11-17  
 
  引言
  
  你可以使用 web service appender 将日志集中到某一位置,同时,web service appender 允许管理者监控、开发者调试面向服务架构(soa)环境里可能存在的任何问题。web service appender 是一种扩展 java 类,它由 log4j 的 appender 类扩展而来。
  
  从定义上看,soa 是一种彼此可以互相通信的服务集合,但这些服务的内容是各自独立的,每一类服务均不受其它服务内容或服务状态的影响,并且这些服务都工作在分布式的系统架构里。在 soa 中,web 服务通常被用来在给定事务中处理请求,这些请求可以是遗留代码、企业级 java beans(ejbs) 的封装,也可以是 java 类的封装,使用一种可以将日志信息聚集在中心位置里的日志纪录方法,能帮助您隔离缺陷和问题,并能让你更好的理解逻辑流的处理。
  
  将特定模块或服务的日志消息纪录到一个中心位置的机制,可以把可能潜在的问题和缺陷降低到最小。
  
  本文对 log4j 的功能进行了大体的概述,并介绍了如何编写自定义的 log4j appender,这类特殊的 appender 将日志消息编到一种特定的 web 服务。
  
  log4j 快速入门
  
  log4j 是一种开放源代码的日志库,它已被发展为 apache software foundation 日志服务项目的子项目。该库是以 ibm 在 90 年代末开发的日志库为基础的,第一版发布于 1999 年。现在它在开放源代码团体得到了广泛使用,它的体系是围绕以下三个主要概念构建起来的:
  
  logger
  
  appender
  
  layout
  
  这些概念可以让您根据消息类型、消息优先级来纪录消息,您可以控制消息在何处结束及消息如何格式化。 logger 是应用程序首先调用以初始化消息纪录的对象。当把某一消息传递给日志时,logger 会生成 loggingevent,对消息进行封装。之后,logger 对象将 loggingevent 传递给与之关联的 appender。
  
  appender 将 loggingevent 所包含的消息发送给指定的目标输出文件。所谓指定的文件,大多数情况下,是 log4 属性文件。一些 appender 存在于 log4j 中。您也可以扩展 appender,使之支持其它的目标文件,比如 xml 文件、控制台等等。
  
  在 log4j 里, loggingevent 被赋予某一级别,以表明它们的优先级。缺省的级别包括如下几种:
  
  off:可能是最高的级别,它是用来关闭日志纪录的
  
  fatal:指出现了非常严重的错误事件,这些错误可能会导致应用程序异常中止
  
  error:指虽有错误,但仍允许应用程序继续运行
  
  warn:指运行环境潜藏着危害
  
  info:指报告信息,这些信息在粗粒度级别上突出显示应用程序的进程
  
  debug:指细粒度信息事件,细粒度信息事件对于应用程序的调试是最有用的
  
  all:可能是最低的级别,其目的是打开所有日志记录
  
  logger 和 appender 也被赋予上述的某一级别,并且仅执行等于或高于它们自身的级别的日志请求。比如,如果一个 appender 属于 info 级别,而日志请求属于 debug,那么 appender 将不会为给定的日志事件写消息。
  
  客户端组件
  
  客户端 log4j.properties 文件
  
  客户端 log4j.properties 文件是一种标准文件,它包含服务或模块使用的所有 appender。web service appender 要求有一个端点(endpoint) 属性以指定所使用的日志服务。
  
  清单 1 描述了使用 webserviceappender 所必需的 web 服务客户端 log4j 属性。 黑体显示的文本指明了将访问 webserviceappender 服务器端的 appender。属性文件是使用 log4j 的基本需求,它可以让您配置应用程序以使用多个 appender 以及 logging severity。一旦应用程序进入运行状态或潜在的问题得到解决,您就可以轻松地修改属性文件。
  
  清单 1:客户端 log4j 的属性文件
  
  #set the level of the root logger log
  4j.rootlogger = info, console
  #set own loggerlog
  4j.logger.com.carmelouria.logging.test=consolelog
  4j.appender.console=com.carmelouria.logging.webserviceappenderlog
  4j.appender.console.endpoint=
  http://localhost:9080/log
  4j/services/logappenderservicelog
  4j.appender.console.layout=org.apache.log
  4j.patternlayoutlog
  4j.appender.console.layout.conversionpattern=%p [%t] %c{2} (%m:%l) :: %m%n
  
  服务器的 log4j.properties 文件
  
  服务器 log4j.properties 文件被用来关联客户端 log4j 属性文件,它指定了日志的级别及服务器将如何输出消息。对于支持 log4j 的应用程序,您可以定义多个 appender。当然,这些 appender 既可以用于客户端服务,也可以用于服务模块。
  
  清单 2 描述了一份典型的 log4j 属性文件,服务器端的 webserviceappender 使用缺省的 log4j appenders。服务器端的 appender 可以潜在的调用另一个 webserviceappender,并将日志信息链接起来:
  
  清单 2:服务器端的 log4j 属性文件
  
  #set the level of the root logger log
  4j.rootlogger = info, file
  #set own loggerlog
  4j.appender.file=org.apache.log
  4j.rollingfileappenderlog
  4j.appender.file.file=c:/temp/log
  4j/server/server.loglog
  4j.appender.file.layout=org.apache.log
  4j.patternlayoutlog
  4j.appender.file.layout.conversionpattern=%p [%t] %c{2} (%m:%l) :: %m%n
  
  客户端程序测试示例:
  
  这个客户端程序示例是无格式普通 java 对象(pojo),它记录了一条消息,并被配置为使用 web service appender 来处理消息。清单 3 显示了这个示例:
  
  清单 3:客户端应用程序使用 webserviceappender 的示例
  
  package com.carmelouria.logging.test;
  import org.apache.log4j.level;
  import org.apache.log4j.logger;
  import org.apache.log4j.propertyconfigurator;
  /**
  * @author carmelo uria
  *
  */public class loggingsample
  {
  private static logger logger = logger.getlogger(loggingsample.class.getname());
  /**
  *
  */
  public loggingsample()
  {
  super();
  propertyconfigurator.configure("c:/temp/log4j.properties");
  logger.log(level.info, "loggingsample instantiation...");
  system.out.println("finished...");
  }
  public static void main(string[] args)
  {
  loggingsample sample = new loggingsample();
  }
  }
  
  webserviceappender
  
  webserviceappender 是必需的,它可以将消息发送到指定的 web 服务。webserviceappender 继承了 org.log4j.appender,它允许使用 log4.properties,并成为有效的 log4j appender。
  
  webserviceappender 使用基于 xml 的远程过程调用 (jax-rpc) 的 java api,来将消息发送到服务器。jax-rpc 是一种规范,它描述使用 rpc 和 xml 构建 web 服务和 web 服务客户端的应用编程接口 (api) 和约定。jax-rpc 又被称为 jsr 101。
  
  loggingevent 通过 soapelement 被分割并表示为 xml。javax.xml.soap.soapelement 接口意味着服务端点接口将包含一个参数,或返回 javax.xml.soap.soapelement 类型的值,以对应于 schema 中每个使用的地方。从本质上看,它是 xml 参数的封装,且没有相应的序列化/反序列化 java 类。例如,一旦客户请求记录一个消息,就会创建一个 loggevent 对象,然后传送给 appender。在这种情况下,appender 就是 webserviceappender。appender 检索事件,并在解析事件中的信息。一些额外的信息会被加入,如主机名称,这样您就知道这些消息来自哪个系统。同时,append 方法也将消息转换为 soapelement,这样就可以通过 executewebservice 方法将消息传递给 web 服务。使用 soapelement 充分考虑了 webserviceappender 未来版本的可扩展性问题。
  
  清单4:执行 webserviceappender 服务的 append 方法
  
  protected void append(loggingevent event)
  {
  // create web service client using endpoint
  if (endpoint == null)
  {
  system.out.println("no endpoint set. check configuration file");
  system.out.println("[" + hostname + "] " + this.layout.format(event));
  return;
  }
  executewebservice(event);
  }
  private void executewebservice(loggingevent event)
  {
  soapclient client = new soapclient();
  url endpoint = null;
  try
  {
  endpoint = new url(getendpoint());
  }
  catch (malformedurlexception e1)
  {
  e1.printstacktrace();
  }
  string namespace = "http://ejb.logging.carmelouria.com";
  qname servicename = new qname(namespace, "logappenderserviceservice");
  qname operation = new qname(namespace, "log");
  qname port = new qname(namespace, "logappenderservice");
  parameter message =
  new parameter("log", constants.xsd_any, soapelement.class, parametermode.in);
  try
  {
  /
 
 
上一篇: spring webflow :重用与抽象框架1(简介)    下一篇: 手工创建的soap消息中命名空间的处理
  相关文档
java的网络功能与编程 二 11-17
jsf的进化——ajax已经来了 11-17
一个工作流引擎的设计概要 11-17
设计模式与java 11-17
unicode编码 解释ucs、utf、bmp、bom 11-17
java事件处理与发送 11-17
java servlet和jsp教程(4) 11-17
配置weblogic 8.1到jbuilderx! 11-17
用java动态代理类实现记忆功能 11-17
几秒搭建web服务器 绿色php环境套件e2php 12-22
java i/o api之性能分析 (下) 11-16
java的垃圾回收机制研究 11-17
corba学习2--corba五步进行曲 11-17
java&xml心得(三) 11-17
java的内存泄漏 11-17
java程序员认证模拟题及详细分析(3) 11-16
我的thinkinginjava学习笔记 11-17
java web start 技术 11-17
为rmi实现类jini的发现机制 11-17
基于jdbc的数据库连接池高效管理策略 11-17
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息