bigywater.tech
gRPC · 42

grpc-go 的日志与调试环境变量

gRPC 出问题时怎么看日志?环境变量怎么设?日志里有什么?怎么接到自己的日志库?channelz 能告诉你什么?这篇用同一个小程序在不同设置下把输出都抓下来对比。

默认 0 条
不设置环境变量时,连不上服务也没有任何日志输出
42 条 → 50 条
INFO 级别与再加 verbosity=2 的日志条数
流层 105 成功 / RPC 层 5 失败
channelz 里同样的调用在流层面全部成功,在 RPC 层有 5 次失败

环境变量

实测 · 本机执行输出
  (不设置)                                                              stderr   0 行,共   0 条日志(INFO 0、WARNING 0、ERROR 0)
  GRPC_GO_LOG_SEVERITY_LEVEL=error                                   stderr   0 行,共   0 条日志(INFO 0、WARNING 0、ERROR 0)
  GRPC_GO_LOG_SEVERITY_LEVEL=warning                                 stderr   1 行,共   1 条日志(INFO 0、WARNING 1、ERROR 0)
      那 1 条 WARNING:WARNING: [core] [Channel #7 SubChannel #8] grpc: addrConn.createTransport failed to connect to {Addr: "127.0.0.1:51182", ServerName: "127.0.0.1:51182", }. Err: connection…
  GRPC_GO_LOG_SEVERITY_LEVEL=info                                    stderr  94 行,共  42 条日志(INFO 41、WARNING 1、ERROR 0)
  GRPC_GO_LOG_SEVERITY_LEVEL=info GRPC_GO_LOG_VERBOSITY_LEVEL=2      stderr 158 行,共  50 条日志(INFO 49、WARNING 1、ERROR 0)
  GRPC_GO_LOG_SEVERITY_LEVEL=info GRPC_GO_LOG_VERBOSITY_LEVEL=99     stderr 158 行,共  50 条日志(INFO 49、WARNING 1、ERROR 0)

GRPC_GO_LOG_SEVERITY_LEVEL 取 error、warning、info,GRPC_GO_LOG_VERBOSITY_LEVEL 取数字(2 就是最详细),GRPC_GO_LOG_FORMATTER=json 输出 JSON。默认不输出,连不上服务也看不到。

日志内容

实测 · 本机执行输出
  GRPC_GO_LOG_SEVERITY_LEVEL=info:共 94 行,前 6 行:
      2026/10/12 20:03:31 INFO: [core] [Server #1] Server created
      2026/10/12 20:03:31 INFO: [core] original dial target is: "127.0.0.1:9800"
      2026/10/12 20:03:31 INFO: [core] [Channel #2] Channel created for target "127.0.0.1:9800"
      2026/10/12 20:03:31 INFO: [core] [Channel #2] parsed dial target is: resolver.Target{URL:url.URL{Scheme:"dns", Opaque:"", User:(*url.Userinfo)(nil), Host:"", Path:"/127.0…
      2026/10/12 20:03:31 INFO: [core] [Channel #2] Channel authority set to "127.0.0.1:9800"
      2026/10/12 20:03:31 INFO: [core] [Channel #2] Channel Connectivity change to CONNECTING
  GRPC_GO_LOG_SEVERITY_LEVEL=info GRPC_GO_LOG_FORMATTER=json:共 42 行,前 6 行:
      {"message":"[core] [Server #1] Server created\n","severity":"INFO"}
      {"message":"[core] original dial target is: \"127.0.0.1:9800\"\n","severity":"INFO"}
      {"message":"[core] [Channel #2] Channel created for target \"127.0.0.1:9800\"\n","severity":"INFO"}
      {"message":"[core] [Channel #2] parsed dial target is: resolver.Target{URL:url.URL{Scheme:\"dns\", Opaque:\"\", User:(*url.Userinfo)(nil), Host:\"\", Path:\"/127.0.0.1:98…
      {"message":"[core] [Channel #2] Channel authority set to \"127.0.0.1:9800\"\n","severity":"INFO"}
      {"message":"[core] [Channel #2] Channel Connectivity change to CONNECTING\n","severity":"INFO"}

通道创建、目标解析、状态变化、子连接创建和失败,带 [Channel #N] [SubChannel #M] 编号。

接到自己的日志库

实测 · 本机执行输出
  自定义 logger 收到:INFO 49 条、WARNING 1 条
      INFO: [core][Server #1] Server created
      INFO: [core]original dial target is: "127.0.0.1:9800"
      INFO: [core][Channel #2] Channel created for target "127.0.0.1:9800"

grpclog.SetLoggerV2 设置自己的 logger,必须在使用 grpc 之前调用。

channelz

实测 · 本机执行输出
  通道 #1 target=127.0.0.1:9800 状态=READY;调用 开始 105、成功 100、失败 5;子通道 1 个
  通道 #2 target=127.0.0.1:9800 状态=READY;调用 开始 1、成功 0、失败 0;子通道 1 个
  服务端 调用 开始 107、成功 101、失败 5;监听 socket 1 个
      服务端连接 #1:流 开始 105、成功 105、失败 0;收到消息 105、发出消息 100;keepalive 发出 0
      服务端连接 #2:流 开始 5、成功 4、失败 0;收到消息 5、发出消息 4;keepalive 发出 0

注册 channelz 服务后可以查通道、子通道、连接和服务器的调用/流/消息计数。注意 RPC 层与流层的区别:返回错误状态的 RPC 在流层面仍算成功。

分步演示

日志与调试
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Go 1.27.1 / grpc-go v1.84.0 / protobuf-go v1.36.12 / golang.org/x/net v0.57.0 / protoc 36.2(Homebrew);服务端和客户端都是本机起的 Go 进程(127.0.0.1,端口 9800 以上,不访问任何外部服务);需要看线上字节时用我自己写的 TCP 抓包代理加 golang.org/x/net/http2 的 Framer 解析 HTTP/2 帧;计时用 time.Now 或 perf_counter,数字每次运行会有小幅抖动。日志数据来自子进程的 stderr,行数和条数用代码统计(日志条数按“以日期开头的行”数,续行不算);“verbosity 99 与 2 相同”只比较了条数;channelz 查询用的是同进程里另一条连接,所以结果里包含查询自身的调用
    • 没有验证:error 级别下是否会有 ERROR 输出(这个小程序没触发);GRPC_GO_LOG_SEVERITY_LEVEL 取其它值的行为;日志对性能的影响;stats.Handler 与 OpenTelemetry(另一类可观测手段);channelz 的 Web 界面(grpc-zpages 类工具);GODEBUG / pprof 对 goroutine 泄漏的排查(第 31、35 篇有相关数字)
    京ICP备2026067502号-1京公网安备11010502063487号