跳到主要内容

在PubSub+ Java API中配置日志记录

Java 的 PubSub+ 消息 API 使用 Jakarta Commons Logging(JCL),也称为 Apache Commons Logging,以支持不同的日志框架。PubSub+ Java API 应用程序可以选择使用 log4j2 或 java.util.logging 作为其日志框架。

支持的日志级别

本节显示了日志框架识别并允许您在生成日志消息时使用的不同日志严重性级别。每个日志级别表示日志消息的不同重要性或严重性程度。使用不同的日志级别时,您可以根据其重要性过滤和优先处理日志消息,这有助于您高效地监控和排查应用程序的问题。

要启用 Kerberos 事件的日志记录,请将 Java 系统属性设置为以下内容:-Dsun.security.krb5.debug=true

级别描述
Fatal这些日志级别保留用于内部错误,应作为调查的原因。对于此级别的日志事件,请联系 Solace 客户支持。
Error
Warn表示应用程序错误(例如,传入的参数无效或对 API 的使用不受支持)。
Info通常用于高级别的状态变化(例如,连接/断开连接/重新连接)。
它还用于不指示任何错误但不寻常且可能需要调查的事件。
Debug此日志级别内容丰富,通常需要 Solace 客户支持来解读。
Trace未使用。

Java 支持的日志级别

当设置在给定级别时,所有比选定级别不严重的日志事件都会被过滤掉,所有同等或更严重的日志级别都会被包括在内。例如,如果选择了 Error 日志过滤级别,则只有 ErrorFatal 事件会被包括。

Java 设计师应该熟悉此类日志框架,因为它们是基于 Java 的系统的既定标准。但是,您应该考虑以下几点:

  • 使用 log4j 时,包含 log4j.properties 文件和 log4j.jar 文件的目录在类路径上。
  • 使用 log4j 时,如果类路径中包含 log4j.jar 库文件但没有 log4j.properties,则会对性能产生负面影响。

要查看 PubSub+ Java API 中日志记录的示例,请参阅 Solace 开发者中心的 GuaranteedSubscriber.java

在 PubSub+ Java API 中的日志记录示例

以下示例展示了如何在应用程序中使用 log4j:

  1. 将 log4j 添加为应用程序的依赖项:

    • Maven 示例:

      <dependencies>
      <dependency>
      <groupId>com.solace</groupId>
      <artifactId>solace-messaging-client</artifactId>
      <version>1.7.0</version>
      </dependency>
      <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
      <version>2.17.2</version>
      </dependency>
      <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <version>2.17.2</version>
      </dependency>
      <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-jcl</artifactId>
      <version>2.17.2</version>
      </dependency>
      </dependencies>
    • Gradle 示例:

      dependencies {
      implementation group: 'com.solace', name: 'solace-messaging-client', version: '1.+'
      ...
      implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.+'
      implementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.+'
      implementation group: 'org.apache.logging.log4j', name: 'log4j-jcl', version: '2.+'
      }
  2. src/dist/config 目录中,配置您的 log4j2.xml 文件。以下示例为 PubSub+ Java API 应用程序中的特定包和类设置控制台日志记录,具有统一的日志消息格式以及 infodebugwarn 级别的日志消息:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" monitorInterval="30">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="--LOG-- %d{HH:mm:ss.SSS} [%t] %-5level %logger{5.} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Logger name="com.solacesystems" level="info" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Logger name="com.solace.samples" level="debug" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Logger name="com.solace.samples.GuaranteedPublisher" level="warn" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
  1. 导入 Apache Log4j 库中的 LogManager 类和 Logger 接口,以在您的应用程序中启用日志记录功能。接下来,创建一个静态日志记录器实例以启用日志记录功能:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
// ...
// ...
private static final Logger logger = LogManager.getLogger();
  1. 在程序中添加日志记录,以提供关键事件(如服务中断和重新连接尝试)的详细日志记录。以下示例展示了如何在服务中断时记录警告消息,包括中断的原因、尝试重新连接时的信息消息以及服务成功重新连接时的信息消息:
final MessagingService messagingService = MessagingService.builder(ConfigurationProfile.V1)
.fromProperties(properties)
.build();
messagingService.connect();
messagingService.addServiceInterruptionListener(serviceEvent -> {
logger.warn("### SERVICE INTERRUPTION: " + serviceEvent.getCause());
});
messagingService.addReconnectionAttemptListener(serviceEvent -> {
logger.info("### RECONNECTING ATTEMPT: " + serviceEvent);
});
messagingService.addReconnectionListener(serviceEvent -> {
logger.info("### RECONNECTED: " + serviceEvent);
});
  1. 以下控制台输出显示了服务中断后成功重新连接尝试的示例日志消息:
   --LOG-- 13:58:20.720 [Context_1_Thread_reconnect_service] INFO  com.solac.sampl.java.patte.GuaranteedPublisher - ### RECONNECTING ATTEMPT: ServiceEventImpl{timestamp=1721843900720, brokerURI='...', message='null', cause=com.solace.messaging.PubSubPlusClientException: com.solacesystems.jcsmp.JCSMPTransportException: Channel is closed by peer} peer}
--LOG-- 13:58:20.720 [Context_1_Thread_reconnect_service] INFO com.solac.jcsmp.proto.impl.TcpClientChannel - Client-1: Connecting to host 'orig=..., host=...' (host 1 of 1, smfclient 1, attempt 3 of 20, this_host_attempt: 4 of 6)
--LOG-- 13:58:20.737 [Context_1_Thread_reconnect_service] INFO com.solac.jcsmp.proto.impl.TcpClientChannel - Client-1: Connected to host 'orig=..., host=...' (smfclient 1) local(/...) remote(.../...)
--LOG-- 13:58:20.754 [Context_1_Thread_reconnect_notify_service] INFO com.solac.sampl.java.patte.GuaranteedPublisher - ### RECONNECTED: ServiceEventImpl{timestamp=1721843900754, brokerURI='...', message='null', cause=null}