使用@azure/service-bus时AMQP会话类错误日志的原因及解决方法
Azure Service Bus @azure/service-bus 收发消息时的rhea-promise错误日志解析与解决办法
日志含义解析
这些日志并非真正的功能错误,只是底层AMQP库rhea-promise的调试信息被误标记为error级别了,你的收发功能正常也印证了这一点。具体拆解:
close receiver explicitly/close client explicitly:代码中显式触发了Receiver或Client的关闭操作rhea-promise:error [connection-4] The receiver '***e87' on amqp session 'local-1_remote-1_connection-4' is open ? -> true:关闭前的状态检查,确认Receiver处于打开状态,属于正常流程的前置步骤detach#16 {"closed":true}:发送AMQP协议的detach帧,正式关闭Receiver/Sender链接receiver_close/sender_close:底层链接关闭的事件通知end#17 {}:发送AMQP协议的end帧,关闭当前Sessionsession_close:Session关闭的事件通知close#18 {}:发送AMQP协议的close帧,关闭整个Connectionconnection_close:Connection关闭的事件通知
简单说,这是一套完整的资源清理流程日志,只是日志级别被错误标记为error,造成了误解。
解决办法
1. 直接忽略(推荐)
既然业务功能正常,这些日志不影响运行,可直接无视。
2. 调整日志级别
通过配置降低rhea和rhea-promise的日志输出级别,过滤掉这类调试信息:
// 调整rhea库的日志级别为warn及以上 const rhea = require("rhea"); rhea.set_log_level("warn"); // 或者使用@azure/logger统一控制Azure SDK日志 const { setLogLevel } = require("@azure/logger"); setLogLevel("warn");
3. 复用ServiceBusClient实例
如果每次收发都创建新的ServiceBusClient、Receiver或Sender,会频繁触发资源关闭流程,导致这类日志重复出现。建议全局复用一个ServiceBusClient实例:
// 全局初始化一次Client const { ServiceBusClient } = require("@azure/service-bus"); const serviceBusClient = new ServiceBusClient("你的连接字符串"); // 收发消息时仅创建/关闭Sender/Receiver async function sendMessage() { const sender = serviceBusClient.createSender("队列名称"); await sender.sendMessages({ body: "测试消息" }); await sender.close(); } async function receiveMessages() { const receiver = serviceBusClient.createReceiver("队列名称"); const messages = await receiver.receiveMessages(1); await receiver.completeMessage(messages[0]); await receiver.close(); } // 程序退出时再关闭全局Client process.on("exit", async () => { await serviceBusClient.close(); });
4. 升级SDK版本
检查并升级@azure/service-bus到最新版本,新版本可能已修复日志级别误标的问题,将这类调试日志调整为debug级别,不再混入error日志中。
内容的提问来源于stack exchange,提问作者Vincente
相关产品推荐
相关产品推荐

