下面按从零到上线的思路,讲一下 Go 程序 + 日志方案 在 Debian 上的部署方式,包括常见做法和推荐方案。
sudo apt update
sudo apt install -y wget
wget https://go.dev/dl/go1.22.5.linux-amd64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go1.22.5.linux-amd64.tar.gz
# 写入环境变量
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
source ~/.bashrc
验证:
go version
log.SetOutput(os.Stdout)
log.SetFlags(log.LstdFlags | log.Lshortfile)
log.Println("server started")
⚠️ 生产环境不建议直接写文件,交给系统管理更好。
log/slog(Go 1.21+,官方)zap(高性能)logrus(老牌)示例(slog):
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
logger.Info("start server", "port", 8080)
✅ 统一输出到 stdout / stderr
go build -o /opt/myapp/app main.go
sudo vim /etc/systemd/system/myapp.service
示例:
[Unit]
Description=My Go App
After=network.target
[Service]
ExecStart=/opt/myapp/app
WorkingDirectory=/opt/myapp
User=appuser
Restart=always
Environment=GO_ENV=production
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp
journalctl -u myapp -f
journalctl -u myapp --since "1 hour ago"
✅ 好处:
logFile, _ := os.OpenFile("/var/log/myapp/app.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
log.SetOutput(logFile)
sudo vim /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
⚠️ copytruncate 对 Go 程序友好
Go App (stdout)
↓
systemd / journald
↓
logrotate / 中央日志(Loki / ELK)
✅ 不要自己造日志系统
export LANG=en_US.UTF-8
stdout/stderrnohup xxx &sudo useradd -r -s /bin/false appuser
sudo chown -R appuser:appuser /opt/myapp
Debian 上部署 Go 日志:程序只打 stdout,systemd + journald 管日志,生产环境别自己写文件。
如果你愿意,我可以:
你想用哪种?