日志管理功能能够将云消息队列 RabbitMQ 版实例的消息操作日志自动推送至您的日志服务的LogStore。当消息发送、消费或确认过程中出现异常时,您可以在日志服务查询并分析消息的操作日志,进行异常诊断。
前提条件
创建云消息队列 RabbitMQ 版实例。具体操作,请参见实例管理。
开通日志服务并创建Project和Logstore。具体操作,请参见存储资源层级关系说明。
根据控制台提示创建RabbitMQ服务关联角色
AliyunServiceRoleForAmqpLogDelivery并授权,用于将日志推送到您的日志服务中。
如果您删除Project、Logstore,或者将授予云消息队列 RabbitMQ 版的权限取消,日志将无法正常推送。
计费说明
云消息队列 RabbitMQ 版
使用日志管理功能时,云消息队列 RabbitMQ 版不收取费用。
日志服务
云消息队列 RabbitMQ 版日志被推送到日志服务后,日志服务会根据存储空间、流量、请求数等进行收费。更多信息,请参见按使用功能计费模式计费项。
日志格式
日志格式说明
参数 | 描述 |
Action | 操作对应的请求方法。取值和描述请参见Action请求方法。 |
Code | 状态码。 取值如下:
|
Info | 请求成功时不显示,显示时表示错误状态码信息。 |
InstanceId | 云消息队列 RabbitMQ 版实例的ID。您可以在云消息队列 RabbitMQ 版控制台的实例详情页面或概览页面查看。 |
Queue | 订阅或者消息对应的Queue。
|
Property | 消息的属性。取值和描述如下:
|
RemoteAddress | 发起该操作的客户端地址。
说明 Action为SendDlqMessage时,不记录该字段。 |
ReqUid | 账号ID。
说明 Action为SendDlqMessage时,不记录该字段。 |
ResourceName | 资源名称。
说明 Action为ConnectionOpen、ConnectionClose、ChannelOpen或ChannelClose时,不记录该字段。 |
VHost | Vhost名称。您可以在云消息队列 RabbitMQ 版控制台的Vhost管理页面查看。 |
ConnectionId | 服务端用于唯一标识Connection。 说明 Action为SendDlqMessage时,不记录该字段。 |
ChannelId | 客户端生成的Channel ID,用于标识当前Connection下的唯一Channel。 说明 Action为ConnectionOpen和ConnectionClose时,为null。 |
microtime | 请求发生时间,单位:微秒。 |
_source_ | 该参数为日志服务SLS(Log Service)的保留字段。如果您想了解该字段的含义,请参见保留字段。 |
__tag__:__receive_time__ | 该参数为日志服务SLS的保留字段。如果您想了解该字段的含义,请参见保留字段。 |
__topic__ | 该参数为日志服务SLS的保留字段。如果您想了解该字段的含义,请参见保留字段。 |
Action请求方法
请求方法 | 说明 |
ConnectionOpen | 开启连接。 |
ConnectionClose | 关闭连接。 |
ChannelOpen | 开启Channel。 |
ChannelClose | 关闭Channel。 |
QueueDeclare | 创建Queue。 |
QueueDelete | 删除Queue。 |
ExchangeDeclare | 创建Exchange。 |
ExchangeDelete | 删除Exchange。 |
ExchangeBind | 绑定路由到Exchange。 |
ExchangeUnBind | 解除源Exchange到目标Exchange的绑定。 |
QueueBind | 绑定路由到Queue。 |
QueueUnbind | 解除源Exchange到目标Queue的 |
SendMessage | 生产者生产消息。 |
PushMessage | 服务端推送消息。 |
BasicGet | 客户端拉取消息。 |
BasicAck | ACK消息。 |
BasicConsume | 订阅Queue。 |
BasicReject | Reject消息。 |
BasicRecover | Recover消息。 |
BasicNack | Nack消息。 |
BasicQos | 设置Consumer的流控。 |
QueuePurge | 清空Queue中所有消息。 |
DeleteMessage | 客户端调用BasicAck,服务端确认消息被成功删除。 |
SendDlqMessage | 发送死信消息。 |
操作步骤
为云消息队列 RabbitMQ 版实例配置LoggingBucket,将日志推送到日志服务。
登录云消息队列 RabbitMQ 版控制台,然后在左侧导航栏选择实例列表。
在实例列表页面的顶部菜单栏选择地域,然后在实例列表中,单击目标实例名称。
在左侧导航栏,单击日志管理。
在我的资源卡片,单击立即授权。
如果您已授予云消息队列 RabbitMQ 版访问日志服务权限,则无需操作。
在日志管理页面,从Project 名称列表,选择已创建的Project,从Logstore 名称列表,选择已创建的Logstore,然后单击启用。
在索引字段中手动添加
__tag__:__receive_time__字段,并设置别名为timestamp。
实践教程
统计各队列消息收发次数以定位高额费用
当控制台无法直接提供队列维度的精确计费明细时,可以利用日志服务中的操作日志,按 Queue 字段聚合统计各队列在指定时间段内的消息收发次数,从而自主定位高消耗队列,无需依赖后台人工提取数据。
操作步骤
登录日志服务控制台,进入已配置云消息队列 RabbitMQ 版日志推送的 Logstore。
在查询分析栏输入以下语句,设置目标时间范围后单击查询/分析:
* | SELECT Queue, SUM(if(Action='SendMessage', 1, 0)) AS "发送次数", SUM(if(Action='PushMessage', 1, 0)) AS "推送次数", SUM(if(Action='BasicGet', 1, 0)) AS "拉取次数", COUNT(*) AS "总操作次数" WHERE Action IN ('SendMessage', 'PushMessage', 'BasicGet') AND Code=200 GROUP BY Queue ORDER BY "总操作次数" DESC LIMIT 100查询结果按总操作次数降序排列,即可定位消息收发量最高的队列。
SendMessage 对应生产者发送消息,PushMessage 对应服务端推送消息,BasicGet 对应客户端拉取消息。上述查询仅统计状态码为 200(成功)的操作。如需调整统计范围(例如包含失败操作或增加其他 Action 类型),可修改 WHERE 子句中的筛选条件。
常见问题
为什么客户端日志打印时间与云消息队列 RabbitMQ 版服务端日志显示的投递成功时间存在差异?
建议按以下步骤排查:
确认服务端投递是否正常:在日志服务中查询服务端操作日志,筛选
Action=PushMessage或Action=DeleteMessage的记录,查看 Code 字段是否均为 200,确认服务端已正常完成投递且无异常延迟。若服务端日志正常,排查客户端环境:客户端记录时间晚于服务端实际投递时间,通常由客户端自身环境因素导致。请重点排查以下情况:
网络波动:客户端与服务端之间存在网络抖动或丢包,导致 ACK 响应延迟到达客户端。
CPU 高负载:客户端 CPU 占用率过高,消息处理线程因得不到及时调度而产生延迟。
内存频繁 Full GC:JVM 发生 Full GC 时所有线程暂停(Stop-the-World),调用
convertAndSend等方法后的处理耗时显著增加,导致客户端记录的完成时间晚于服务端实际投递时间。
收到云消息队列 RabbitMQ 版报警日志或告警通知后如何分析原因?
收到报警日志时,建议按以下步骤定位根因:
查看日志中的控制台链接:报警日志通常包含关联的控制台地址(例如
cis.console.alibabacloud.com相关链接),单击该链接直接进入对应的任务详情页或集群监控页。查看任务详情和指标数据:在任务详情页查看详细的报警上下文,结合集群监控指标(如连接数、消息堆积量、网络流量等),定位触发报警的根本原因。
关联操作日志深入分析:如需进一步排查,可在日志服务中,以报警发生时间为基准,查询对应队列或实例的操作日志,结合 Code 字段和 Action 字段分析异常原因。常见触发场景包括:消息大量堆积、消费者连接中断、频繁创建或删除资源等。