我在 EMQX 日志中看到如下 error 日志,想确认一下该日志的具体含义,以及应该如何进一步定位根因。
日志如下:
{
“time”: 1779107976312384,
“level”: “error”,
“msg”: “message=channel_closed driver=tcp socket="#Port<0.164581>" action=stopping”,
“pid”: “<0.5763482.0>”
}
- EMQX 版本:5.8.4
我在 EMQX 日志中看到如下 error 日志,想确认一下该日志的具体含义,以及应该如何进一步定位根因。
日志如下:
{
“time”: 1779107976312384,
“level”: “error”,
“msg”: “message=channel_closed driver=tcp socket="#Port<0.164581>" action=stopping”,
“pid”: “<0.5763482.0>”
}
这条日志表示一个 TCP channel 被动关闭了,EMQX 随后把该 channel 进程停掉(action=stopping)。
socket="#Port<...>" 是 Erlang 运行时内部的 socket ,,单看这一条没法直接定位根因。
不过。常见两类原因:
gen_rpc/Mria 通道被对端拒绝或网络抖动后关闭。connect_to_remote_servergen_rpc / mria / partitioneconnrefused / econnreset / tcp_closed如果怀疑是客户端侧,贴对应 clientid 的 emqx_connection_terminated 日志
把关联日志贴出来,基本就能把原因定到网络/对端拒绝/客户端断开这三类里。
05/18 20:39:38.390263
{"time":1779107977723540,"level":"info","msg":"Mria(Membership): Node emqx@10.xxxxxx down","domain":["mria","membership"],"pid":"<0.3599.0>"}
05/18 20:39:37.389310
{"time":1779107976324278,"level":"error","msg":"message=channel_closed driver=tcp socket=\"#Port<0.73>\" action=stopping","pid":"<0.5176.0>"}
05/18 20:39:26.381000
{"time":1779107966193138,"level":"info","msg":"event=initializing_client driver=tcp node=\"emqx@10.xxxxxxx\" port=5369","pid":"<0.5929.0>"}
感觉是集群中的场景,出现了集群场景的tcp channel报错,会影响什么呢。
这是集群节点间的 RPC/Mria 通道断开。Node emqx@... down 已经说明对端节点在该时刻被判定离线,channel_closed 是后续清理动作。
会有的影响主要是这段离线窗口:
:
emqx ctl cluster status --json,看 stopped_nodes 是否持续出现同一节点。connect_to_remote_server、econnrefused、econnreset、mria、gen_rpc。日志显示的节点,经过蓝绿部署后已经下线了,为什么emqx还在往已经下线的老节点同步呢
这是预期行为:老节点虽然下线了,但还在集群成员或发现源里,存活节点会继续尝试连它的 5369,所以你会看到 initializing_client + channel_closed。
先按这三步处理:
emqx ctl cluster status --json,确认旧节点是否在 stopped_nodes。emqx ctl cluster force-leave emqx@旧节点名,再查一次 cluster status,确保它已经被移除。static:从 cluster.static.seeds 删除旧节点并滚动重启;dns / k8s:删除旧 IP / endpoint,确认解析结果里不再有它。cluster.autoclean 默认是 24h,不手动 force-leave 的话,这段时间里重连日志会反复出现。