在 Debian 上运行 Go 程序时“日志为空”,通常不是 Debian 本身的问题,而是日志写到了你没看的地方,或者程序根本没执行到写日志的代码。下面按最常见原因逐一说明。
log 包,但没看 stdout / stderrGo 标准库:
log.Println("hello")
默认输出到 stderr,不是文件。
./app > out.log → 日志在 out.log 里没有./app > out.log 2>&1
或./app 2>&1 | tee out.log
✅ Debian 下 systemd 服务日志也是走 stderr
如果你是用 systemd 启动:
[Service]
ExecStart=/opt/app/app
那日志在:
journalctl -u your-service -f
而不是你期望的文件。
✅ 解决方式:
journalctl -u app.service
StandardOutput=append:/var/log/app.log
StandardError=append:/var/log/app.log
Debian 默认:
nobody / www-data 运行/var/log 只有 root 可写log.SetOutput(os.OpenFile("/var/log/app.log", ...))
如果没权限 → 直接 panic 或静默失败
✅ 检查:
ls -l /var/log/app.log
ps aux | grep app
例如:
logruszapzerologlogrus.Info("start")
// 进程立刻退出
缓冲区没刷盘。
✅ 解决:
log.Sync() // zap
或在 main 结束前 sleep / 正常退出。
比如:
os.Exit(1) 在日志前init() 中 panic✅ 排查:
func main() {
fmt.Println("main start") // 先确认进没进
log.Println("log test")
}
Debian 常见:
logrotate# 1. 是否在 stderr
./app 2>&1 | cat
# 2. systemd
journalctl -u app -f
# 3. 文件权限
ls -l /var/log/app.log
# 4. 程序是否执行
strace -f ./app 2>&1 | grep write
如果你愿意,可以把:
发出来,我可以直接帮你定位是哪一条。