在 Debian 上用 Go(Golang) 开发或部署服务时,定位错误一般从 日志来源 + 工具 + 代码层 三个维度来做。下面给你一套实用思路。
如果 Go 程序是通过 systemd 启动的:
journalctl -u your-service-name -f
查看历史错误:
journalctl -u your-service-name --since "2024-01-01" --priority=err
常见日志位置:
/var/log/your-app/stdout / stderr查看:
tail -f /var/log/your-app/app.log
docker logs -f container_name
log 或 log/slog(推荐 Go 1.21+)示例(slog):
import "log/slog"
slog.Error("db query failed",
"err", err,
"user_id", userID,
)
日志示例:
time=... level=ERROR msg="db query failed" err="timeout" user_id=123
✅ 好处:
只用 errors.New 不够,推荐:
import "github.com/pkg/errors"
err := errors.Wrap(dbErr, "query user by id")
或 Go 1.20+:
import "errors"
err = fmt.Errorf("query user: %w", dbErr)
打印:
slog.Error("request failed", "err", err)
grep -i "error\|panic\|fatal" app.log
tail -n 100 app.log
tail -f app.log
panic: runtime error
goroutine 1 [running]
panic 堆栈定位到:
ulimit -c unlimited
运行后:
gdb your-binary core
✅ 最佳实践:
systemd + journaldslog(结构化日志)errors.Wrap你可以告诉我:
我可以给你针对你项目的具体定位方案。