在Kubernetes中使用Delve调试Go应用时如何查看应用原始日志?
问题描述
我用Kubernetes和Helm Chart部署了一套微服务系统,其他服务通过Netcat等待waiter-service启动,但该服务用Delve启动后无法正常工作,需要查看它的应用日志来排查问题。
当前Dockerfile的入口命令为:
/dlv --listen=:40000 --log --log-output=rpc --allow-non-terminal-interactive=true --api-version=2 exec /server -- appname --config=configfile.yaml
目前仅能获取到Delve的RPC日志:
2022-08-24T13:22:11Z debug layer=rpc serving JSON-RPC on new connection 2022-08-24T13:22:11Z debug layer=rpc <- RPCServer.SetApiVersion(api.SetAPIVersionIn{"APIVersion":2}) 2022-08-24T13:22:11Z debug layer=rpc -> *api.SetAPIVersionOut{} error: "" 2022-08-24T13:22:11Z debug layer=rpc <- RPCServer.IsMulticlient(rpc2.IsMulticlientIn{}) 2022-08-24T13:22:11Z debug layer=rpc -> *rpc2.IsMulticlientOut{"IsMulticlient":false} error: "" 2022-08-24T13:22:11Z debug layer=rpc (async 3) <- RPCServer.State(rpc2.StateIn{"NonBlocking":true}) 2022-08-24T13:22:11Z debug layer=rpc (async 3) -> rpc2.StateOut{"State":{"Pid":14,"Running":false,"Recording":false,"CoreDumping":false,"currentThread":{"id":14,"pc":4652512,"file":"/usr/lib/go-1.18/src/runtime/rt0_linux_amd64.s","line":8,"function":{"name":"_rt0_amd64_linux","value":4652512,"type":0,"goType":0,"optimized":true},"goroutineID":0,"ReturnValues":null,"CallReturn":false},"Threads":[{"id":14,"pc":4652512,"file":"/usr/lib/go-1.18/src/runtime/rt0_linux_amd64.s","line":8,"function":{"name":"_rt0_amd64_linux","value":4652512,"type":0,"goType":0,"optimized":true},"goroutineID":0,"ReturnValues":null,"CallReturn":false}],"NextInProgress":false,"WatchOutOfScope":null,"exited":false,"exitStatus":0,"When":""}} error: "" 2022-08-24T13:22:11Z debug layer=rpc <- RPCServer.Recorded(rpc2.RecordedIn{}) 2022-08-24T13:22:11Z debug layer=rpc -> *rpc2.RecordedOut{"Recorded":false,"TraceDirectory":""} error: ""
但直接用正常命令启动时:
/server appname --config=configfile.yaml
能获取到预期的应用日志:
2022/08/24 07:43:43 maxprocs: Leaving GOMAXPROCS=16: CPU quota undefined 2022-08-24T07:43:44.976Z INFO database/pool.go:35 database configuration {"MaxConns": 8, "RetryCount": 10, "RetryInterval (seconds)": 5} 2022-08-24T07:43:44.976Z INFO v4@v4.15.0/conn.go:355 Dialing PostgreSQL server {"host": "postgres-infras.emulator.svc.cluster.local"} 2022-08-24T07:43:44.980Z INFO nats/jetstream.go:335 nats jetstream connected 2022-08-24T07:43:45.090Z INFO zap/grpclogger.go:92 [core][Channel #1 SubChannel #2] Subchannel Connectivity change to READY {"system": "grpc", "grpc_log": true}
解决方案
1. 调整Delve参数,启用应用日志转发并自动启动程序
当前Delve命令的问题有两个:一是只输出RPC日志,未转发应用的标准输出/错误;二是程序默认处于暂停状态,未开始执行。修改启动命令如下:
/dlv --listen=:40000 --log --log-output=rpc,debugger --allow-non-terminal-interactive=true --api-version=2 --forward-signals --continue exec /server -- appname --config=configfile.yaml
--log-output=rpc,debugger:让Delve同时输出RPC日志和调试器核心日志,包含应用的stdout/stderr转发内容--continue:启动后自动继续执行程序,避免停在入口点等待调试指令(这是当前服务无法工作的核心原因)--forward-signals:将系统信号转发给被调试应用,保证信号处理逻辑正常
2. 分离应用日志与Delve日志(可选)
如果需要单独查看应用日志,可以将应用输出重定向到容器内的文件,之后通过kubectl exec查看:
/dlv --listen=:40000 --log --log-output=rpc --allow-non-terminal-interactive=true --api-version=2 --continue exec /server -- appname --config=configfile.yaml > /app/app.log 2>&1
执行以下命令查看日志:
kubectl exec <pod-name> -- cat /app/app.log
3. Kubernetes日志排查注意事项
- 确保Pod的
stdout和stderr被正确采集,kubectl logs默认捕获这两个输出流 - 如果修改参数后仍看不到应用日志,检查集群的日志采集配置(如Fluentd、Loki等),确认未过滤相关日志内容
内容的提问来源于stack exchange,提问作者Kien D
相关产品推荐
相关产品推荐

