温馨提示×

debian golang日志怎定位错

小樊
42
2026-09-04 01:58:24
栏目: 编程语言

在 Debian 上用 Go 写服务时,“日志怎么定位错”通常可以从 日志内容、日志位置、错误堆栈、系统日志 几个层面来做。下面给你一套比较实用的定位思路。


一、先确认日志在哪里

1. 应用自己打的日志

Go 程序一般用:

  • log
  • log/slog
  • zap
  • logrus

常见输出位置:

  • 标准输出(容器 / systemd 能看到)
  • 文件,如 /var/log/yourapp.log

先看程序是怎么初始化的:

log.SetOutput(os.Stdout)
// 或
log.SetOutput(&lumberjack.Logger{
    Filename: "/var/log/yourapp.log",
})

2. systemd 服务(Debian 常见)

如果是 systemd 启动:

journalctl -u yourapp.service -f
journalctl -u yourapp.service --since "10 min ago"

查看是否报错:

journalctl -u yourapp.service -p err

二、Go 错误信息怎么看

1. 普通 error

Go 的错误通常只是一行字符串:

if err != nil {
    log.Println("db query failed:", err)
}

重点看:

  • 错误发生前你打的 上下文日志
  • 错误内容本身(文件、行号一般没有)

2. 有堆栈的错误(推荐)

pkg/errorsfmt.Errorf + %w

import "github.com/pkg/errors"

err := errors.Wrap(err, "failed to connect db")
log.Println(err)

或 Go 1.13+:

err := fmt.Errorf("failed to connect db: %w", err)

这样日志里能看到:

failed to connect db: dial tcp 127.0.0.1:5432: connect: connection refused

三、panic / 崩溃怎么定位

1. panic 日志长这样

panic: runtime error: invalid memory address or nil pointer dereference
goroutine 1 [running]:
main.main()
    /home/user/app/main.go:23 +0x45

关键信息:

  • main.go:23 → 出错代码行
  • goroutine 1 → 主协程

2. 防止 panic 丢失信息

在 Debian 服务里建议加:

defer func() {
    if r := recover(); r != nil {
        log.Println("panic:", r)
    }
}()

四、结合 Debian 系统日志

1. 系统级错误

dmesg | tail

常见:

  • OOM(内存不足杀进程)
  • 权限问题

2. 文件 / 端口问题

ls -l /var/log/yourapp.log
ss -tulnp | grep 8080

五、推荐的一套“好定位”的日志写法

logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))

logger.Error("db query failed",
    slog.String("sql", "select * from user"),
    slog.Int("uid", 123),
    slog.Any("error", err),
)

好处:

  • 有上下文
  • 有 error
  • systemd / 文件都好搜

六、快速定位 checklist

✅ 看 systemd 日志
✅ 看应用日志文件
✅ 找 error / panic 关键字
✅ 看错误前后上下文
✅ 确认端口 / 权限 / 配置
✅ 本地用相同参数跑一次


如果你愿意,可以把 具体错误日志贴出来(脱敏后),我可以直接帮你定位是哪一类问题。

0