客户端日志用于记录客户端运行过程中的异常,帮助快速定位和修复问题。本文介绍 SOFAMQ 的客户端日志的打印以及配置方式。
日志依赖
消息队列的 TCP Java SDK 基于 SLF4J 接口编程。
依赖 log4j 或 logback 作为日志实现的示例代码如下所示。
方式一:依赖 log4j 作为日志实现
<dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.7</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.7</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
方式二:依赖 logback 作为日志实现
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.1.2</version> </dependency>
自定义配置
配置说明
日志保存路径:请确保应用进程有对该路径写的权限,否则日志不会打印。
保存历史日志文件的最大个数:支持 1 到 100 之前的数值;若输入的值超出该范围或格式错误,则系统默认保存 10 个。
日志级别:支持 ERROR、WARN、INFO、DEBUG 中任何一种,不配置则默认为 INFO。
配置方式
方式一:环境参数
在 Java SDK 中自定义客户端日志配置,请设置系统参数 logging.path,日志保存路径(默认保存在
/home/admin/logs
目录下)。-Dlogging.path=/opt/sofamq/logs
方式二:xml 文件配置(仅 3.4.18+ 版本支持)
配置基于被加载到 resource 中的
logback.xml
文件。traceLog xml 配置
这部分为 SOFAMQ 收发消息的 traceLog 日志,需要依赖下文的 Trace 相关 JAR 包。
<!-- traceLog Appender --> <appender name="SofaMQTraceLogAppender" class="com.alipay.sofa.sofamq.client.trace.log.SofaMQFileAppender"> <traceDirectory>/home/admin/logs/tracelog</traceDirectory> <!-- 默认保存7天 --> <maxHistory>7</maxHistory> </appender> <!-- traceLog logger --> <logger name="SofaMQTraceLog" level="${LOG_LEVEL}" additivity="false"> <appender-ref ref="SofaMQTraceLogAppender"/> </logger> <!-- sofamq common appender --> <appender name="SOFAMQ-COMMON-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender"> <append>true</append> <file>${LOG_HOME}/sofamq/common-default.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>${LOG_HOME}/sofamq/common-default.log.%d{yyyy-MM-dd-HH}</FileNamePattern> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d %-5p %c{2}, %m%n</pattern> <charset>${LOG_ENCODE}</charset> </encoder> </appender>
appender 和 logger 的 name 名称必须固定为 SofaMQTraceLogAppender 以及 SofaMQTraceLog,否则无法被 SOFAMQ 识别。
traceDirectory:Trace 文件夹路径,打印出来的 traceLog 文件名称固定为
mq-pub-digest.log
和mq-sub-digest.log
,不支持重命名。MaxHistory:可以针对日志的最大保留时间做修改。
应用日志 xml 配置
本部分为 SOFAMQ 默认的应用日志输出配置,格式与 logback 类似。
<!-- sofamq error appender --> <appender name="SOFAMQ-COMMON-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender"> <append>true</append> <filters> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>DENY</onMatch> </filter> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>${LOG_LEVEL}</level> <onMatch>ACCEPT</onMatch> </filter> </filters> <file>${LOG_HOME}/common-default.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>${LOG_HOME}/common-default.log.%d{yyyy-MM-dd-HH}</FileNamePattern> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d %-5p %c{2}, %m%n</pattern> <charset>${LOG_ENCODE}</charset> </encoder> </appender> <appender name="SOFAMQ-ERROR-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender"> <append>true</append> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <file>${LOG_HOME}/common-error.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>${LOG_HOME}/common-error.log.%d{yyyy-MM-dd-HH}</FileNamePattern> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d %-5p %c{2}, %m%n</pattern> <charset>${LOG_ENCODE}</charset> </encoder> </appender> <!-- sofamq logger --> <logger name="RocketmqClient" level="${LOG_LEVEL}" additivity="false"> <appender-ref ref="SOFAMQ-COMMON-APPENDER"/> <appender-ref ref="SOFAMQ-ERROR-APPENDER"/> </logger> <logger name="RocketmqRemoting" level="${LOG_LEVEL}" additivity="false"> <appender-ref ref="SOFAMQ-COMMON-APPENDER"/> <appender-ref ref="SOFAMQ-ERROR-APPENDER"/> </logger> <logger name="RocketmqCommon" level="${LOG_LEVEL}" additivity="false"> <appender-ref ref="SOFAMQ-COMMON-APPENDER"/> <appender-ref ref="SOFAMQ-ERROR-APPENDER"/> </logger>
tracelog
Trace 日志用于记录应用运行过程中生产者与消费者所处理的消息链路相关信息,有助于快速定位问题。
Trace 依赖
使用 tracelog 的能力,需要配置 Tracer 相关的 POM 依赖。
<dependency>
<groupId>com.alipay.common</groupId>
<artifactId>tracer</artifactId>
<version>3.1.0</version>
</dependency>
日志路径
使用 自定义配置 中配置的日志路径。
日志说明
适用于 3.4.x 版本。
mq-pub-digest.log
mq-pub-digest.log
是生产者日志,日志样例如下:
2021-05-07 10:29:57.048,SOFAMQ,0a0fe9291620354596788100162419,0,0A0FE929F3D318B4AAC22126E4A70000,00,TP_WUMUHX,TAGA,GZ00B@BROKER_LDC_EXCLUSIVE@broker-3,3,88,0,0,0,GID_DEMO,0ms,259ms,main,,
对应 key 的说明如下:
key | 说明 |
timestamp | 日志打印时间 |
app | 应用名称 |
traceId | TraceId 更多信息,请参见 TraceId 和 SpanId 生成规则。 |
RpcId | RpcId |
MessageId | MessageId |
ResultCode | 结果码。取值如下:
|
Topic | Topic |
Tag | 二级消息的标识 |
Broker | 获取消息的目标 Broker |
QueueId | QueueId |
Offset | 位点 |
DelaySeconds | 定时消息的延迟时间,单位为毫秒。 |
ReconsumeTimes | 重消费的次数 |
MessageType | 消息类型。取值如下:
|
Group | 消费者 Group |
消费模式 |
|
处理延迟 | 发送耗时,(日志打印时间-发送开始时间)ms |
线程名称 | 发送线程的名称 |
系统穿透数据 | 系统穿透数据 |
穿透数据 | 穿透数据 |
mq-sub-digest.log
mq-sub-digest.log
是消费者日志,日志样例如下:
2021-05-07 10:29:57.048,SOFAMQ,0a0fe9291620354596788100162419,0,0A0FE929F3D318B4AAC22126E4A70000,00,TP_WUMUHX,TAGA,GZ00B@BROKER_LDC_EXCLUSIVE@broker-3,3,88,0,0,0,GID_DEMO,0ms,259ms,main,,
对应 key 的说明如下:
key | 说明 |
timestamp | 日志打印时间 |
app | 应用名称 |
traceId | TraceId 更多信息,请参见 TraceId 和 SpanId 生成规则。 |
RpcId | RpcId |
MessageId | MessageId |
ResultCode | 结果码。取值如下:
|
Topic | Topic |
Tag | 二级消息的标识 |
Broker | 获取消息的目标 Broker |
QueueId | QueueId |
Offset | 位点 |
DelaySeconds | 定时消息的延迟时间,单位为毫秒。 |
ReconsumeTimes | 重消费的次数 |
MessageType | 消息类型。取值如下:
|
Group | 消费者 Group |
消费延迟 | (Consumer 消费消息的时间-消息存储到 Broker 的时间)ms |
处理延迟 | 消费耗时,(日志打印时间-消费开始时间)ms |
线程名称 | 消费线程的名称 |
系统穿透数据 | 系统穿透数据 |
穿透数据 | 穿透数据 |