Cloudflare Tunnel 会生成一组诊断日志,可用于排查 cloudflared 的问题。诊断报告会收集在本地机器上运行的单个 cloudflared 实例的数据。
获取诊断日志的步骤取决于您的 cloudflared 部署环境。
- 主机上已安装
cloudflared版本 2024.12.2 或更高版本
这些说明适用于直接在主机上运行的远程管理和本地管理隧道。
-
(仅限 Linux)要在日志中包含网络诊断,请允许
cloudflared用户在没有 root 权限的情况下创建 RAW 和 PACKET 套接字:sudo setcap cap_net_raw+ep /usr/bin/traceroute && sudo setcap cap_net_raw+ep /usr/bin/traceroute如果您没有设置
cap_net_raw,则 traceroute 数据将不可用。 -
获取诊断日志:
cloudflared tunnel diag如果在同一个宿主机上运行着多个
cloudflared实例,请为要诊断的实例指定 指标服务器(metrics server)IP 和端口。例如:cloudflared tunnel diag --metrics 127.0.0.1:20241
此命令将输出每个诊断任务的状态,并在您的工作目录中放置一个 cloudflared-diag-YYYY-MM-DDThh-mm-ss.zip 文件。
cloudflared 从 Tunnel 指标服务器(tunnel metrics server)读取诊断数据。要获取诊断日志,必须从 Docker 容器中公开指标服务器,并使其可从宿主机访问。
确定在 Docker 中运行的
cloudflared实例的 指标服务器端口。-
确保在部署容器时启用了端口转发。诊断功能将使用本地端口
20241向 Docker 实例请求信息,因此您应该将端口20241转发到步骤 1 中获取的容器端口:docker run -d -p 20241:<metrics_port> docker.io/cloudflare/cloudflared tunnel ... -
验证您可以从 Docker 宿主环境访问指标服务器地址:
curl localhost:20241/diag/tunnel该命令应返回一个 JSON:
{ "tunnelID": "ef96b330-a7f5-4bce-a00e-827ce5be077f", "connectorID": "d236670a-9f74-422f-adf1-030f5c5f0523", "connections": [ { "isConnected": true, "protocol": 1, "edgeAddress": "198.41.192.167"}, {"isConnected": true, "protocol": 1, "edgeAddress": "198.41.200.113", "index": 1}, {"isConnected": true, "protocol": 1, "edgeAddress": "198.41.192.47", "index": 2}, {"isConnected": true, "protocol": 1, "edgeAddress": "198.41.200.73", "index": 3} ], "icmp_sources": ["192.168.1.243", "fe80::c59:bd4a:e815:ed6"] } -
使用 Docker 容器 ID 运行诊断:
cloudflared tunnel diag --diag-container-id=<containerID>或者,您可以指定容器的名称而不是其 ID:
cloudflared tunnel diag --diag-container-id=<containerName>使用容器 ID 运行诊断命令允许
cloudflared从 Docker 环境中收集信息,例如日志和容器详细信息。
此命令将输出每个诊断任务的状态,并在您的工作目录中放置一个 cloudflared-diag-YYYY-MM-DDThh-mm-ss.zip 文件。
诊断功能将使用端口 20241 到 20245 从 Tunnel 指标服务器(tunnel metrics server)请求数据。您需要使用端口转发,以允许本地 cloudflared 实例在这些端口之一上连接到指标服务器。
确定 Tunnel 的 指标服务器端口。
-
启用端口转发:
kubectl port-forward <pod> <diagnostic_port>:<metrics_port><pod>:运行 Tunnel 的 pod 的名称<diagnostic_port>是20241到20245范围内的任何本地端口。<metrics_port>是您要诊断的cloudflared实例的 Kubernetes pod 端口(在步骤 1 中获取)。
例如,如果您将指标服务器地址设置为
0.0.0.0:12345:kubectl port-forward cloudflared-6d4897585b-r8kfz 20244:12345发送到本地端口
20244的连接将转发到运行 Tunnel 的 pod 的端口12345。 -
运行诊断:
cloudflared tunnel diag --diag-pod-id=<podID>如果 pod 运行着多个应用程序/服务,且
cloudflared不是 pod 中的第一个,您必须指定容器 ID 或名称:cloudflared tunnel diag --diag-pod-id=<podID> --diag-container-id=<containerName>
此命令将输出每个诊断任务的状态,并在您的工作目录中放置一个 cloudflared-diag-YYYY-MM-DDThh-mm-ss.zip 文件。
cloudflared-diag-YYYY-MM-DDThh-mm-ss.zip 压缩包包含以下列出的文件。文件中的数据要么适用于正在接受诊断的 cloudflared 实例(diagnosee,被诊断实例)要么适用于触发诊断的实例(diagnoser,诊断发起实例)。例如,如果您的 Tunnel 在 Docker 容器中运行,则被诊断实例(diagnosee)是 Docker 实例,而诊断发起实例(diagnoser)是宿主机实例。
| 文件名 | 描述 | 实例 |
|---|---|---|
cli-configuration.json |
启动 Tunnel 时使用的 Tunnel 运行参数 | diagnosee |
cloudflared_logs.txt |
Tunnel 日志文件[^1] | diagnosee |
configuration.json |
Tunnel 配置参数 | diagnosee |
goroutine.pprof |
由 pprof 提供的 goroutine 分析文件 |
diagnosee |
heap.pprof |
由 pprof 提供的 heap(堆)分析文件 |
diagnosee |
metrics.txt |
诊断时 Tunnel 指标的快照 | diagnosee |
network.txt |
使用 IPv4 和 IPv6 到 Cloudflare 全球网络的 JSON 格式 traceroute 结果 | diagnoser |
raw-network.txt |
使用 IPv4 和 IPv6 到 Cloudflare 全球网络的原始 traceroute 结果 | diagnoser |
systeminformation.json |
操作系统信息和资源使用情况 | diagnosee |
task-result.json |
每个诊断任务的结果 | diagnoser |
tunnelstate.json |
诊断时的 Tunnel 连接情况 | diagnosee |
[^1]:如果日志文件为空,您可能需要在启动 Tunnel 时 将 --loglevel 设置为 debug。只有当您从 CLI 使用 cloudflared tunnel run 命令运行 Tunnel 时,才需要 --loglevel 参数。如果 Tunnel 作为 Linux/macOS 服务运行,或者在 Docker/Kubernetes 中运行,则不需要此参数。