在 Debian 上排查 Golang 程序日志,通常可以从日志来源、日志位置、运行方式、排查工具几个层面来做。下面按实战场景给你一个清晰路线。
Go 程序常见日志方式:
log.Println / log.Fatalfmt.Printlnzap / logrus / slog看代码里有没有指定输出文件:
log.SetOutput(os.OpenFile("/var/log/myapp.log", ...))
如果没有指定,默认是:
go run main.go
# 或
./myapp
日志直接打印在终端
排查:
./myapp 2>&1 | tee run.log
如果你是用 systemd 管理的:
systemctl status myapp
journalctl -u myapp
看实时日志:
journalctl -u myapp -f
看某次启动:
journalctl -u myapp -b
⚠️ 注意:
Go 日志默认进 journal,不会自动写文件
docker logs myapp
docker logs -f myapp
如果日志被重定向到文件:
docker exec -it myapp sh
cat /var/log/myapp.log
nohup ./myapp > app.log 2>&1 &
查看:
tail -f app.log
tail -f /var/log/syslog
(Debian 默认用 rsyslog)
dmesg | tail
OOM 被杀常见:
Out of memory: Kill process (go)
检查:
快速验证:
log.Println("test log")
journalctl -u myapp -n 50
常见原因:
ls -l /var/log/myapp.log
sudo chown myapp:myapp /var/log/myapp.log
log/slog(Go 1.21+)zap(高性能)/var/log/myapp/access.log
/var/log/myapp/error.log
# 1. 看服务状态
systemctl status myapp
# 2. 看日志
journalctl -u myapp -f
# 3. 看系统日志
tail -f /var/log/syslog
# 4. 看进程
ps aux | grep myapp
# 5. 看端口
ss -lntp | grep :8080
如果你愿意,可以告诉我:
我可以直接帮你定位 具体该看哪个日志文件。