You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 19:48:22