使用 JMX 通知来监视应用程序日志记录

Java 开发者可以创建程序以使用 JMX 通知来监视应用程序服务器日志。

有关此任务

大多数常用日志消息侦听器都是用 Java 编写的,他们将使用 SOAP 来连接至 Deployment Manager 或应用程序服务器。 使用本主题来构建用于侦听日志事件的 Java 客户机。
注: 本主题引用一个或多个应用程序服务器日志文件。 作为建议的替代方法,您可以将服务器配置为使用高性能可扩展日志记录 (HPEL) 日志和跟踪基础结构,而不是在分布式系统和 IBM® i 系统上使用 SystemOut.logSystemErr.logtrace.logactivity.log 文件。 您还可以将 HPEL 与本机 z/OS® 日志记录工具结合使用。 如果您正在使用 HPEL,那么可以从服务器概要文件 bin 目录使用 LogViewer 命令行工具来访问所有日志和跟踪信息。 有关使用 HPEL 的更多信息,请参阅 有关使用 HPEL 对应用程序进行故障诊断的信息。
避免麻烦: 将侦听器添加到日志记录量较高的服务器时请小心,因为 JMX 通知会使服务器变慢。

过程

  1. 导入必需的软件包。
    在 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; 
    
  2. 创建用于实现 NotificationListener 接口的 Java 类。
  3. 实现 handleNotification 方法。
    以下示例是一个将消息文本写至 Java 控制台的样本:
    public void handleNotification(Notification notification, Object handback) {
            RasMessage rasMessage = (RasMessage)notification.getUserData() ;
            System.out.println("Localized message: " + rasMessage.getLocalizedMessage(null));
    }
    
  4. 连接至要监视其 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
            } 
  5. 检索 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() ; 
    
  6. 添加通知侦听器。
    此样本代码将添加一个通知侦听器,在该通知侦听器处理通知时等待 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
            }
    
  7. 将必需的 jar 添加到类路径。
    将管理客户机 jar 文件添加到类路径,以便能够编译和运行您的代码。 The admin client jar file is in the <install_root>/runtimes directory.

结果

您已经创建一个 Java 程序,它可以侦听来自应用程序服务器的日志事件通知并因此而执行操作。