Java 开发者可以创建程序以使用 JMX 通知来监视应用程序服务器日志。
有关此任务
大多数常用日志消息侦听器都是用
Java 编写的,他们将使用 SOAP 来连接至 Deployment Manager
或应用程序服务器。 使用本主题来构建用于侦听日志事件的 Java 客户机。
注: 本主题引用一个或多个应用程序服务器日志文件。 作为建议的替代方法,您可以将服务器配置为使用高性能可扩展日志记录 (HPEL) 日志和跟踪基础结构,而不是在分布式系统和 IBM® i 系统上使用
SystemOut.log ,
SystemErr.log,
trace.log和
activity.log 文件。 您还可以将 HPEL 与本机 z/OS® 日志记录工具结合使用。 如果您正在使用 HPEL,那么可以从服务器概要文件 bin 目录使用
LogViewer 命令行工具来访问所有日志和跟踪信息。 有关使用 HPEL 的更多信息,请参阅
有关使用 HPEL 对应用程序进行故障诊断的信息。
避免麻烦: 将侦听器添加到日志记录量较高的服务器时请小心,因为 JMX 通知会使服务器变慢。
过程
- 导入必需的软件包。
在 Java 程序的开始处一般需要下列 import 语句:
import javax.management.Notification;
import javax.management.NotificationListener;
import javax.management.ObjectName;
import javax.management.InstanceNotFoundException;
import javax.management.MalformedObjectNameException;
import com.ibm.websphere.management.AdminClient;
import com.ibm.websphere.management.AdminClientFactory;
import com.ibm.websphere.management.exception.ConnectorException;
此外,为了处理消息以及后续步骤中的调用所返回的类型,需要下列 import 语句。
import java.util.Iterator;
import java.util.Properties;
import java.util.Set;
import com.ibm.websphere.ras.RasMessage;
- 创建用于实现 NotificationListener 接口的 Java 类。
- 实现 handleNotification 方法。
以下示例是一个将消息文本写至 Java 控制台的样本:
public void handleNotification(Notification notification, Object handback) {
RasMessage rasMessage = (RasMessage)notification.getUserData() ;
System.out.println("Localized message: " + rasMessage.getLocalizedMessage(null));
}
- 连接至要监视其 JMX MBean 的服务器的 SOAP 端口。
以下代码将使用指定的主机和指定的端口来创建一个使用
SOAP 连接的 AdminClient 对象:
AdminClient adminClient = null ;
String hostName = "someHostName";
String soapPort = "8880";
Properties connectProps = new Properties();
connectProps.setProperty(AdminClient.CONNECTOR_TYPE, "SOAP");
connectProps.setProperty(AdminClient.CONNECTOR_HOST, hostName);
connectProps.setProperty(AdminClient.CONNECTOR_PORT, soapPort);
try {
adminClient = AdminClientFactory.createAdminClient(connectProps);
} catch (ConnectorException e) {
// error handling code
}
- 检索 RasLoggingService MBean 的 MBean 对象名。
以下代码将检索 RasLoggingService MBean 对象名:
String queryString = "WebSphere:cell="+cellName+",node="+nodeName+",process="+serverName+",
type=RasLoggingService,*" ;
Set<ObjectName> objectMBeans = null;
try {
ObjectName queryName = new ObjectName(queryString);
objectMBeans = (Set<ObjectName>)adminClient.queryNames(queryName, null);
if (objectMBeans.size() > 1) {
// error handling code to deal with the case where we get more than one name returned.
}
} catch (MalformedObjectNameException e) {
// error handling code
} catch (ConnectorException e) {
// error handling code
}
if (objectMBeans.isEmpty()) {
// error handling code to deal with the case where the MBean is not found
}
Iterator<ObjectName> objectNames = objectMBeans.iterator() ;
ObjectName objectName = objectNames.next() ;
- 添加通知侦听器。
此样本代码将添加一个通知侦听器,在该通知侦听器处理通知时等待 60 秒,然后移除该通知侦听器。 只要需要,侦听器可以一直处于连接状态。
try {
adminClient.addNotificationListener(objectName, this, null, null);
Thread.sleep(60 * 1000) ;
adminClient.removeNotificationListener(objectName, this) ;
} catch (InstanceNotFoundException e) {
// error handling code
} catch (ConnectorException e) {
// error handling code
} catch (Exception e) {
// error handling code
}
- 将必需的 jar 添加到类路径。
将管理客户机 jar 文件添加到类路径,以便能够编译和运行您的代码。 The admin client jar file is in the <install_root>/runtimes directory.
结果
您已经创建一个 Java 程序,它可以侦听来自应用程序服务器的日志事件通知并因此而执行操作。