Cloudflare Tunnel 提供日志、指标和诊断工具,帮助您监控隧道运行状况并解决问题。
您可以转到 Networking(网络) > Tunnels(隧道) 在 Cloudflare 仪表板 ↗中检查隧道连接状态,或者通过运行 cloudflared tunnel list 来检查。
| 状态 | 含义 | 建议的操作 |
|---|---|---|
| Healthy(健康) | 隧道处于活动状态,并通过与 Cloudflare 全球网络的四个连接来提供流量服务。 | 无需采取任何操作。您的隧道运行正常。 |
| Inactive | 隧道已创建(通过 API 或 仪表板),但从未运行 cloudflared 连接器来建立连接。 |
在您的源服务器上安装并运行 cloudflared 以将隧道连接到 Cloudflare。您可以在 Cloudflare 仪表板中的 Networking(网络) > Tunnels(隧道) 下找到安装命令——选择您的隧道,然后选择 Overview(概览) 选项卡中的 Add a replica(添加副本)。对于基于 API 的设置,请参阅安装并运行隧道。 |
| Down(中断) | 隧道此前已连接,但当前已断开连接,因为 cloudflared 进程已停止。 |
1. 确保 cloudflared 服务或进程在您的服务器上处于活动运行状态。 2. 检查服务器端问题,例如机器断电、应用程序崩溃或最近的网络变更。 |
| Degraded(降级) | cloudflared 连接器正在运行且隧道正在提供流量服务,但至少有一个单独的连接失败。若隧道可用性进一步降级,可能会有隧道停机并无法提供流量服务的风险。 |
1. 查看您的 cloudflared 日志以获取连接失败或错误消息。 2. 调查本地网络和防火墙规则,以确保它们没有阻止与 Cloudflare Tunnel IP 和端口的连接。 |
管理员可以在隧道运行状况或部署状态发生变化时收到警报。通知可以通过电子邮件、webhook 或第三方服务发送。
要配置隧道通知,请参阅创建通知。
Tunnel Creation or Deletion Event
Who is it for?Customers who want to receive a notification when Cloudflare Tunnels are created or deleted in their account.
Other options / filtersNone.
Included withAll Cloudflare Zero Trust plans.
What should you do if you receive one?No action is needed.
Tunnel Health Alert
Who is it for?Customers who want to be warned about changes in health status for their Cloudflare Tunnels.
Other options / filtersNone.
Included withAll Cloudflare Zero Trust plans.
What should you do if you receive one?Monitor tunnel health over time and consider deploying cloudflared replicas or load balancers.
Refer to Tunnel status to review the list of possible tunnel statuses (Healthy, Inactive, Down and Degraded).
隧道日志记录了 cloudflared 与 Cloudflare 全球网络之间的所有活动,以及 cloudflared 与您的源服务器之间的所有活动。
如果您可以访问源服务器,则可以使用 --loglevel 标志在启动 Tunnel 时启用日志记录。默认情况下,cloudflared 将日志打印到 stdout,并且不会在服务器上存储日志。您可以选择使用 --logfile 标志将日志写入文件。
要启用日志,请使用 --loglevel info 和 --logfile <PATH> 标志运行 Tunnel。例如,
cloudflared tunnel --loglevel info --logfile cloudflared.log run <UUID>您可以在无需通过 SSH 访问服务器的情况下,实时从正在运行的隧道中流式传输日志。
cloudflared 守护进程可以将您账户中任何 Tunnel 的日志流式传输到本地命令行。您的本地机器和源服务器上都必须安装 cloudflared。
-
在本地机器上,向您的 Cloudflare 账户身份验证
cloudflared:cloudflared tunnel login -
针对特定的 Tunnel 运行
cloudflared tail:cloudflared tail <UUID>为了更结构化地查看 JSON 消息,您可以将输出管道传输到类似 jq ↗ 的工具:
cloudflared tail --output=json <UUID> | jq .
- 如果您运行了多个副本,则可以指定从哪个副本流式传输日志:
要找到副本 ID,请转到 Networking(网络) > Tunnels(隧道) 并选择您的隧道。所有活动副本都会显示在隧道概述页面的 Connectors(连接器) 列表中。副本 ID 就是 Connector ID(连接器 ID)。cloudflared tail --connector-id <REPLICA ID> <UUID>
日志过滤选项
您可以按事件类型 (--event)、事件级别 (--level) 或采样率 (-sampling) 过滤日志,以减少从源站流式传输的日志量。这有助于减轻对源站的性能影响,尤其是在源站通常处于高负载的情况下。例如:
cloudflared tail --level debug <UUID>| 标志 | 描述 | 允许的值 | 默认值 |
|---|---|---|---|
--event |
按事件/请求的类型进行过滤。 | cloudflared, http, tcp, udp |
所有事件 |
--level |
返回此级别及以上的日志。独立于服务器上的 --loglevel 设置运行。 |
debug, info, warn, error, fatal |
debug |
--sampling |
对总日志的一部分进行采样。 | 0.0 到 1.0 之间的数字 |
1.0 |
要从仪表板流式传输 Tunnel 日志:
- 在 Cloudflare 仪表板 ↗中,转到 Zero Trust > Networks(网络) > Connectors(连接器) > Cloudflare Tunnels(Cloudflare 隧道)。
- 选择您要监控的 Tunnel 旁的 View logs。
- 选择 Begin log stream(开始日志流)。
如果您针对同一个 Tunnel 运行多个 cloudflared 实例(也称为副本),您可以流式传输特定副本的日志:
- 在 Cloudflare 仪表板 ↗中,转到 Zero Trust > Networks(网络) > Connectors(连接器) > Cloudflare Tunnels(Cloudflare 隧道) 并选择您的 Tunnel。
- 在 Connectors(连接器) 列表中,选择您要查看的副本的 Connector ID(连接器 ID)。
- 选择 Begin log stream(开始日志流)。
Tunnel 指标可以显示 Cloudflare Tunnel 随着时间推移的吞吐量和资源使用情况。当您运行 Tunnel 时,cloudflared 会启动一个 Prometheus 指标终结点 —— 即一个以 Prometheus ↗ 格式公开指标的 HTTP 服务器。您可以在远程机器上使用 Prometheus 工具包从 cloudflared 服务器抓取指标数据。
在非容器化环境中,cloudflared 将指标服务器启动在 127.0.0.1:<PORT>/metrics 上,其中 <PORT> 是 20241 到 20245 范围内第一个可用的端口。如果所有端口都不可用,cloudflared 会绑定到一个随机端口。在容器化环境(Docker、Kubernetes)中,默认地址为 0.0.0.0:<PORT>/metrics。
要确定默认端口,请在 Tunnel 启动时左右检查您的 Tunnel 日志。例如:
2024-12-19T21:17:58Z INF Starting metrics server on 127.0.0.1:20241/metrics要在自定义 IP 地址和端口上提供指标服务,请在 cloudflared 主机上执行以下步骤:
使用
--metrics标志运行 Tunnel。例如,cloudflared tunnel --metrics 127.0.0.1:60123 run my-tunnel-
通过访问
http://localhost:60123/metrics验证指标服务器是否正在运行。这仅在您配置了本地主机 IP(127.0.0.1或0.0.0.0)时才有效。
您现在可以将指标导出到 Prometheus 和 Grafana,以进行数据可视化和查询。有关如何开始使用这些工具的说明,请参阅 Grafana 教程。
cloudflared 指标
| 名称 | 描述 | 类型 | 标签 |
|---|---|---|---|
build_info |
构建和版本信息。 | GAUGE | goversion, revision, type, version |
cloudflared_config_local_config_pushes |
推送到 Cloudflare 的本地配置次数。 | COUNTER | |
cloudflared_config_local_config_pushes_errors |
在推送本地配置期间发生的错误次数。 | COUNTER | |
cloudflared_orchestration_config_version |
配置版本。 | GAUGE | |
cloudflared_tcp_active_sessions |
正在代理到任何源站的并发 TCP 会话数。 | GAUGE | |
cloudflared_tcp_total_sessions |
已代理到任何源站的 TCP 会话总数。 | COUNTER | |
cloudflared_tunnel_active_streams |
活动数据流的总数。 | GAUGE | |
cloudflared_tunnel_concurrent_requests_per_tunnel |
通过每个 Tunnel 代理的并发请求数。 | GAUGE | |
cloudflared_tunnel_ha_connections |
活动的高可用(HA)连接数。 | GAUGE | |
cloudflared_tunnel_request_errors |
代理到源站时的错误数。 | COUNTER | |
cloudflared_tunnel_server_locations |
每个 Tunnel 连接到的位置。1 表示当前位置,0 表示之前的位置。 |
GAUGE | connection_id, edge_location |
cloudflared_tunnel_timer_retries |
未确认的心跳计数。 | GAUGE | |
cloudflared_tunnel_total_requests |
通过所有 Tunnel 代理的请求数。 | COUNTER | |
cloudflared_tunnel_tunnel_authenticate_success |
成功进行 Tunnel 身份验证的事件数。 | COUNTER | |
cloudflared_tunnel_tunnel_register_success |
成功的 Tunnel 注册次数。 | COUNTER | rpcName |
cloudflared_udp_active_sessions |
正在代理到任何源站的并发 UDP 会话数。 | GAUGE | |
cloudflared_udp_total_sessions |
已代理到任何源站的 UDP 会话总数。 | COUNTER | |
coredns_panics_total |
Panic 次数。 | COUNTER | |
quic_client_closed_connections |
已关闭的连接数。 | COUNTER | |
quic_client_latest_rtt |
在连接上测量到的最新往返时间(RTT)。 | GAUGE | conn_index |
quic_client_lost_packets |
从连接中丢失的封包数。 | COUNTER | conn_index, reason |
quic_client_min_rtt |
在连接上测量到的最低 RTT(以毫秒为单位)。 | GAUGE | conn_index |
quic_client_packet_too_big_dropped |
从源站接收到的、因过大而无法发送到 Cloudflare 并因此被丢弃的封包数。 | COUNTER | |
quic_client_smoothed_rtt |
为连接计算的平滑 RTT(以毫秒为单位)。 | GAUGE | conn_index |
quic_client_total_connections |
发起的连接数。对于所有 QUIC 指标,客户端指发起连接的一方。 | COUNTER |
Prometheus 指标
| 名称 | 描述 | 类型 | 标签 |
|---|---|---|---|
promhttp_metric_handler_requests_in_flight |
当前正在提供服务的抓取请求数。 | GAUGE | |
promhttp_metric_handler_requests_total |
按 HTTP 状态代码分类的抓取总数。 | COUNTER | code |
Go 运行时指标
| 名称 | 描述 | 类型 | 标签 |
|---|---|---|---|
go_gc_duration_seconds |
垃圾回收周期的暂停持续时间摘要。 | SUMMARY | |
go_goroutines |
当前存在的 goroutine 数量。 | GAUGE | |
go_info |
有关 Go 环境的信息。 | GAUGE | version |
go_memstats_alloc_bytes |
已分配且仍在使用中的字节数。 | GAUGE | |
go_memstats_alloc_bytes_total |
分配的字节总数,即使已被释放。 | COUNTER | |
go_memstats_buck_hash_sys_bytes |
剖析存储桶哈希表所使用的字节数。 | GAUGE | |
go_memstats_frees_total |
释放的总次数。 | COUNTER | |
go_memstats_gc_sys_bytes |
用于垃圾回收系统元数据的字节数。 | GAUGE | |
go_memstats_heap_alloc_bytes |
已分配且仍在使用中的堆字节数。 | GAUGE | |
go_memstats_heap_idle_bytes |
等待被使用的堆字节数。 | GAUGE | |
go_memstats_heap_inuse_bytes |
正在使用中的堆字节数。 | GAUGE | |
go_memstats_heap_objects |
已分配的对象数。 | GAUGE | |
go_memstats_heap_released_bytes |
释放给操作系统的堆字节数。 | GAUGE | |
go_memstats_heap_sys_bytes |
从系统获取的堆字节数。 | GAUGE | |
go_memstats_last_gc_time_seconds |
自 1970 年以来最后一次垃圾回收的秒数。 | GAUGE | |
go_memstats_lookups_total |
指针查找的总次数。 | COUNTER | |
go_memstats_mallocs_total |
内存分配(malloc)的总次数。 | COUNTER | |
go_memstats_mcache_inuse_bytes |
mcache 结构正在使用的字节数。 | GAUGE | |
go_memstats_mcache_sys_bytes |
从系统获取的用于 mcache 结构的字节数。 | GAUGE | |
go_memstats_mspan_inuse_bytes |
mspan 结构正在使用的字节数。 | GAUGE | |
go_memstats_mspan_sys_bytes |
从系统获取的用于 mspan 结构的字节数。 | GAUGE | |
go_memstats_next_gc_bytes |
下一次垃圾回收发生时的堆字节数。 | GAUGE | |
go_memstats_other_sys_bytes |
用于其他系统分配的字节数。 | GAUGE | |
go_memstats_stack_inuse_bytes |
栈分配器正在使用的字节数。 | GAUGE |
Cloudflare Tunnel 生成收集本地计算机上运行的单个 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 文件。
Docker 诊断
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 文件。
Kubernetes 诊断
诊断功能将使用端口 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 中运行,则不需要此参数。