dev2dev 首页 > 资源中心 > 技术文章
关于AquaLogic Enterprise Service Bus中日志扩展的实现
引言
任何一个应用系统,无论其实现的功能如何,一些非功能性的需求都是系统设计人员、开发人员和系统维护人员所关心的。这些方面的需求我们通常都可以在不同的软件和应用系统中所发现,如:用户的安全管理、系统的扩展性要求(即:群集支持和容错处理)、部署支持、运行监控等等,而应用所需提供的日志记录,也是属于这一范畴。
AquaLogic Enterprise Service Bus(简称为:ESB)对于这些非功能性的需求同样提供了强大的机制来实现。下面我们来简单的讨论一下在ESB中关于日志记录的一些实现方式,以及如何能够通过扩展定制ESB中的日志记录。
ESB日志相关操作简介
对于日志处理,ESB缺省的提供了一个名为Log的动作,通过该动作可以在ESB中所定义的处理流程中,添加Log动作,用于记录流程中的信息。其实与ESB可以用于日志记录的相关动作包含三种,它们分别是Alert, Log和Report:
- Log动作:在ESB中的代理服务(Proxy)中的阶段(Stage)定义中,可以使用该动作,将流程中的信息写入Weblogic Server的日志中

图示:使用Log动作
- Report动作:在流程中通过按照Key/Value方式将流程中的信息捕获,以方便跟踪或监控,通常是在差错处理过程中使用,捕获的信息会存储到ESB缺省配置的数据库的数据表中,然后可以使用ESB中缺省的JMS Reporting Provider或自定义的Reporting Provider读取。

图示:使用Report 动作

图示:查看Report的捕获历史记录
- Alert动作:使用“Alert”动作可以生成警报,将其发送给“Alert的目标”。Alert的目标可以是通过JMS或SMTP配置的指定位置。

图示:使用Alert动作
上述三种动作是ESB中所提供的缺省的日志处理的机制,而现实中用户的需求还是有些不同的。首先用户在ESB上构建的流程处理应用可以配置独立的日志记录,以方便应用层级的管理和监控人员了解应用层面的处理状况,而且每个用户对于日志的格式和结构也多少有些差异。
这些方式为用户在ESB上扩展开发属于应用自身层面日志处理提供了一些借鉴思路,即:日志信息可以通过写文件、发送JMS消息和记录到数据库中三种方式来实现。而在ESB中实现上述三种方式有多种技术手段:
- 采用Publish方式将信息发送到文件中
- 采用JMS方式将数据消息发送到指定的JMS队列中
- 采用Java Call-out或自己编写DB相关的Transport,将信息存储到数据库中
- 采用Java Call-out编写自己的LOG处理机制,将信息写入文件
而这几种方式理论上都可以实现自定义扩展日志记录的机制,但这些方式都存在着一定不足。对于Publish和JMS方式,都需要在ESB中配置相关的Business Services,而在流程中实际上是处理应用本身的逻辑同时,还要求设计人员调用配置的这些业务服务,这一定程度上造成业务逻辑变得复杂,不方便调试和逻辑调整以及影响系统的执行效率;采用Java Call-out方式,与业务服务调用的情况类似,需要在业务流程中加入Java Call-out动作来进行日志记录。
结合Log4J,扩展ESB日志处理
有鉴于此,我们希望能够在ESB中找到一种相对快捷,对开发影响小,而且更加便于配置、管理和维护的日志处理机制。Log4J对于所有Java的应用设计和开发人员而言都不是陌生的,利用Log4j我们可以对自己的程序添加所需要的日志处理,并且通过配置文件,方便我们设置和调整日志的级别和范围。
对于ESB而言,如果构建在ESB上的应用处理流程也可以使用Log4j的机制进行应用层面的日志记录,对于系统开发人员、管理人员而言是十分方便的,可以在应用的调试和应用监控方面提供有益的帮助。
下面,我们就探讨一下如何在ESB中结合Log4j,对流程处理需要日志记录的信息进行扩展的实现机制。
步骤1: 配置应用服务器,采用Log4J方式记录系统日志
对于WebLogic服务器而言,提供了两种日志记录机制,一种是基于标准JDK所提供的Java Logging API方式来实现的日志记录功能,另外一种是使用Log4j日志记录方式。服务器缺省的配置都是使用Java Logging API方式来实现日志记录,因此为了能实现扩展,对于服务器首先是需要将服务器的Server日志记录方式更改为Log4j。
配置方法如下:
- 将$WL_HOME/server/lib/wllog4j.jar 和 log4j.jar 文件添加到服务器 CLASSPATH 来配置 Log4j 日志记录。在完成该任务时,建议将 wllog4j.jar 和 log4j.jar 文件放到 $DOMAIN /lib 目录中,这样Server启动时,会将这些JAR文件自动加载。
- 在setDomainEnv.cmd文件添加以下参数,将其作为Server的启动参数, “-Dweblogic.log.Log4jLoggingEnabled=true”。
- 登录进入Weblogic Console,从“Home > Summary of Servers > AdminServer”选择“Logging”选项,配置Server的Log机制采用Log4J(缺省配置为JDK)。

图示:在WebLogic Console中配置使用Log4j来记录Server日志
当重新Weblogic应用服务器启动后,WebLogic会采用Log4j的日志记录方式来记录服务器日志。这样ESB中使用Log动作所生成的日志,一样会采用Log4j方式记录到Server日志文件中。
步骤2: 配置Log4J的Filter和Appender
为了能够让ESB在记录日志时,能够将ESB相关的信息从记录整个Weblogic服务器所有信息的Server.log文件中剥离,我们需要在使用Log4J配置进行定制扩展,首先我们需要定义相关的Log4J的Appender,这样可以生成与Server日志文件相独立的Appender文件来用于日志记录;然后我们需要编写一个Log4J的Subscriber,通过该subscriber接收记录到Server.log中的记录信息;最后需要定制日志的过滤器(Filter),通过该Filter将和ESB相关的信息进行过滤,并信息记录到所配置的Appender中。
- 配置Log4j的配置文件log4jConfig.xml,根据需要定义不同的Appender,该配置文件需要放置在您Weblogic Domain的根目录下。
参考的Log4J的Appender配置如下:
<appender name="Learning" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="F:/Teddy.log"/>
<param name="Append" value="true"/>
<param name="MaxFileSize" value="500KB"/>
<param name="MaxBackupIndex" value="2"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="#### <%d{yyyy-MM-dd HH:mm:ss}> <%p> %c - %m%n"/>
</layout>
</appender>
- 编写Filter Class,实现根据自定义规则实现日志的订阅,由于采用了Log4j的日志记录方式,因此该Filter Class需要继承org.apache.log4j.spi.Filter,通过扩展int decide(LoggingEvent event)方法来完成日志信息的过滤。Filter日志信息的主要依据是日志信息中是否带有该Appender的名称。
具体过滤的条件如下:
首先是只接收ESB相关的日志,Weblogic中ESB相关的日志都包含“ALSB Logging”的标识,然后再根据自身业务需要配置定义其他的过滤条件,如“日志的等级”或其他过滤的标识符等。
Filter的示例代码如下:
public class LogFilter extends Filter{
public LogFilter(String appnderName) {
projectName = appnderName;
}
public int decide(LoggingEvent event) {
if (event instanceof WLLog4jLogEvent) {
WLLog4jLogEvent wlsEvent = (WLLog4jLogEvent) event;
// 首先读取ESB相关的日志,都是以ALSB Logging标识
if (wlsEvent.getSubsystem().equals("ALSB Logging")
//按照Log4j Appender的名称过滤
&& wlsEvent.getLogMessage().indexOf(projectName)> 0
// 定义日志等级为INFO以上,而DEBUG级别不截获
&& wlsEvent.getSeverity() <= Severities.INFO) {
return ACCEPT;
}
}
return DENY;
}
private String projectName;
}
3、通过weblogic.logging.log4j.Log4jLoggingHelper类的getLog4jServerLogger()方法来从Server端的日志框架中获取Logger,并配置Filter后,为每个Logger增加Appender。
public class Log4jController {
public static void main(String[] args) throws Exception {
try {
DOMConfigurator.configure("log4jConfig.xml");
Logger logger = Log4jLoggingHelper.getLog4jServerLogger();
Enumeration e = Logger.getRootLogger().getAllAppenders();
// logger.getAllAppenders();
while (e.hasMoreElements()) {
Appender app = (Appender)e.nextElement();
String projectName = app.getName();
if (projectName == null || projectName.equalsIgnoreCase("stdout"))
continue;
else{
System.out.println("Get Appender Name =>"+projectName);
Filter myFil = new LogFilter(projectName);
app.clearFilters();
app.addFilter(myFil);
logger.addAppender(app);
}
}
// The Appender is configured using either the log4j props file or
// other custom mechanism.
} catch (LoggerNotAvailableException lex) {
System.err
.println("Unable to get a reference to the log4j Logger: "
+ lex.getMessage());
}
}
}
- 将步骤三的实现代码的编译并打包,生成的JAR文件也放置到Weblogic DOMAIN启动相关的CLASSPATH中,或直接部署到$DOMAIN/lib目录中,并配置该Log4J处理相关的CLASS成为Weblogic的 startup class

图示:配置Startup Class

图示:启动后,相关Log4j的Appender被加载
步骤3: ESB中使用扩展的Log动作
在ESB中,你可以制订不同的过滤策略,前面的示例中,我们采用的是基于ESB中每个项目定制Appender和Filter的策略。
使用时,进入ESB配置界面(http://localhost:7001/sbconsole),相应的对每个ESB Project中的Proxy Service流程中,在需要记录日志的位置,采用ESB中标准的Log动作来完成。为了能够让日志信息写入我们扩展的日志配置文件中,我们需要在”with Annotation”的输入框中加入Log4j 配置文件中为该项目所定义的Appender的名称。

图示:ESB中配置Log动作,并加入过滤条件
进入ESB的测试页面,测试我们刚刚配置的Proxy流程,输入流程所需要的数据并提交。

图示:测试ESB中的Proxy流程
此时我们可以查看Weblogic Console中是否记录了我们所提交的信息,

图示:Server Console中显示的日志信息
然后在使用任何文本编辑器打开我们所配置的Appender所指定的日志文件,查看是否有ESB流程中所对应的日志信息。

图示:自定义日志文件中的记录
通过上述步骤,我们可以发现,通过WebLogic/AquaLogic ESB与Log4J的结合,为我们在ESB应用开发中提供了一种扩展的日志处理机制,该机制一方面利用ESB已有的日志处理能力,同时也为我们自己管理和监控应用相关的信息提供了一种便捷、快速的方式。
下载本文参考示例
参考文档:
| 作者简介 |
 皮山杉 |
皮山杉是BEA系统(中国)有限公司高级技术顾问 |
作者其它文章
|