编程笔记

lifelong learning & practice makes perfect

Go GOBACKTRACK 采集崩溃日志

GOTRACEBACK 的作用与级别

GOTRACEBACK 决定了程序崩溃时输出的堆栈信息详细程度,支持以下级别配置:

  • none 仅输出崩溃的异常信息,不显示任何 goroutine 堆栈
  • single 显示引发 panic 的当前 goroutine 堆栈(默认值)
  • all 输出所有用户创建的 goroutine 堆栈(排除 runtime 内部)
  • system 输出所有 goroutine 的堆栈,包括 runtime 内部创建的(如 GC 相关)
  • crash 在 system 基础上生成 coredump 文件,用于后续调试

使用方法

配置

开启crash前需要将ulimit -c 配置为

1
ulimit -c unlimited

要永久生效需要修改 /etc/security/limits.conf,增加

1
2
3
# root是用户名,对全部用户生效使用 * ,修改可以使用su 切换下用户,使用ulimit -c查看是否生效
root soft core unlimited
root hard core unlimited

ubuntu 配置 * 时su切换用户不能立即生效可能需要重启系统,配置指定用户如 you_user_name 可以

使用

1
2
3
4
5
6
7
8
9
# 示例:输出所有 goroutine 堆栈并生成 coredump 
GOTRACEBACK=crash go run main.go

# fatal error: fault [signal SIGBUS: bus error]
# goroutine 1 [running]:
# runtime.throw(...)
# goroutine 2 [forcegc (idle)]:
# runtime.gopark(...)
# ...

结合supervisor使用

1
2
3
4
5
6
7
8
9
10
11
[program:your_program]
user=you_user_name
command=/path/to/your/go/program ; 替换为你的Go程序的实际路径
directory=/path/to/your/go/program/dir ; 替换为你的Go程序的工作目录
autostart=true
autorestart=true
stderr_logfile=/var/log/your_program.err.log
stdout_logfile=/var/log/your_program.out.log
redirect_stderr=true
; 设置多个环境变量
environment=GOTRACEBACK="system",GOPATH="/usr/local/go"

修改supervisor配置后需要使用命令加载配置并重启程序

1
2
sudo supervisorctl reread
sudo supervisorctl restart your_program

最佳实践

生产环境建议:设置 GOTRACEBACK=crash 以生成 coredump,配合日志和监控工具定位问题。
调试场景:使用 system 级别获取完整堆栈,快速定位并发或 runtime 相关问题。
资源管理:确保服务器有足够磁盘空间存储 coredump 文件(尤其是高频崩溃场景)。
通过合理配置 GOTRACEBACK 并结合其他工具链,可以有效捕获和分析 Go 程序的崩溃日志,提升系统稳定性。

欢迎关注我的其它发布渠道

Related Issues not found

Please contact @yiGmMk to initialize the comment