在 Linux 下排查 Golang 程序的日志问题,通常可以从日志本身、程序运行方式、系统层面、代码层面几个角度入手。下面按实战思路给你梳理一套方法。
很多 Go 程序直接打到:
stdout(标准输出)stderr(标准错误)不同启动方式位置不同:
# 前台运行
./app
# nohup
nohup ./app > app.log 2>&1 &
# systemd
journalctl -u your-service -f
log 标准库:默认 stderrzap / logrus:一般写文件或 stdoutlog:
file: /var/log/app/app.log
先 ps + lsof 看文件:
ps aux | grep app
lsof -p <pid> | grep log
tail -f /var/log/app/app.log
多文件:
tail -f app.log error.log
按关键字:
tail -f app.log | grep ERROR
如果是 systemd 服务:
journalctl -u your-service -f
journalctl -u your-service --since "10 min ago"
journalctl -u your-service -p err
配置文件示例:
[Service]
StandardOutput=journal
StandardError=journal
常见级别:
debug < info < warn < error
代码里确认:
logger.SetLevel(logrus.InfoLevel)
或 zap:
zap.NewProductionConfig().Level = zap.NewAtomicLevelAt(zap.DebugLevel)
LOG_LEVEL=debug ./app
Go panic 默认打到 stderr:
./app 2>err.log
cat err.log
defer func() {
if r := recover(); r != nil {
log.Printf("panic: %v", r)
}
}()
dmesg | tail
看是否有:
Out of memory: Kill process
strace -f -e trace=write -p <pid>
lsof -p <pid> | grep log
grep "2026-01-21 10:" app.log | grep ERROR
确认是否用了:
logrotatezap 的 Rotationls -lh /var/log/app/
✅ 用结构化日志(zap / slog)
✅ 日志带:
✅ 关键路径打 debug 日志
✅ panic 一定 recover + 写日志
# 1. 找进程
ps aux | grep app
# 2. 看日志文件
lsof -p <pid> | grep log
# 3. 实时看
tail -f <logfile>
# 4. systemd
journalctl -u app -f
# 5. 错误
grep ERROR app.log | tail -50
如果你愿意,可以把:
发出来,我可以直接帮你定位。