在 Debian 上“管 Golang 日志”一般分三层:
1) 程序里怎么写日志(Go 侧)
2) 系统层面怎么收集/轮转(Debian 侧)
3) 日常怎么查看和运维
下面给你一套常用且稳妥的方案,从简单到规范。
log.SetOutput(os.Stdout)
log.SetFlags(log.LstdFlags | log.Lshortfile)
然后让 Debian 去接管 stdout(见第二节)。
logFile, _ := os.OpenFile("/var/log/myapp/app.log",
os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
log.SetOutput(logFile)
⚠ 问题:文件不会自动轮转,要配合 logrotate。
log/slog(Go 1.21+,官方)zaplogrus示例(slog + 文件):
logger := slog.New(slog.NewTextHandler(os.Stdout, nil))
logger.Info("start server")
✅ 最佳实践:Go 只输出到 stdout/stderr,日志管理交给 Debian
/etc/systemd/system/myapp.service
[Unit]
Description=My Go App
[Service]
ExecStart=/opt/myapp/myapp
User=myapp
Restart=always
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now myapp
journalctl -u myapp
journalctl -u myapp -f # 实时
journalctl -u myapp --since "1 hour ago"
✅ 优点:
/var/log/myapp/app.log
/etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
⚠ copytruncate 对 Go 程序友好(不重启也能轮转)
journalctl -u myapp -f
journalctl -u myapp -p err
journalctl --disk-usage
journalctl --vacuum-size=100M
| 项目 | 推荐 |
|---|---|
| Go 日志 | slog → stdout |
| 进程管理 | systemd |
| 日志系统 | journald |
| 高级需求 | 接 rsyslog / loki / ELK |
你现在是开发环境还是服务器生产环境?