gRPC 出问题时怎么看日志?环境变量怎么设?日志里有什么?怎么接到自己的日志库?channelz 能告诉你什么?这篇用同一个小程序在不同设置下把输出都抓下来对比。
(不设置) 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 之前调用。
通道 #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 在流层面仍算成功。