在 Debian 上运行 Golang 程序时,“日志如何存”通常可以从 三个层面 来看:
1)Golang 代码里怎么写日志
2)日志写到哪里(文件 / systemd / 集中式)
3)Debian 系统层面如何管理日志
下面给你一个实用、可落地的方案。
log.SetOutput(os.Stdout)
log.Println("server started")
在 Debian 上如果用 systemd 启动,stdout 会自动进 journal。
f, _ := os.OpenFile("/var/log/myapp/app.log",
os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
log.SetOutput(f)
⚠️ 注意:
/var/log/myapp 要存在myapp)示例(zap):
logger, _ := zap.NewProduction()
logger.Info("started", zap.String("env", "debian"))
适合:服务类程序
# /etc/systemd/system/myapp.service
[Unit]
Description=My Go App
[Service]
ExecStart=/usr/local/bin/myapp
User=myapp
Restart=always
[Install]
WantedBy=multi-user.target
日志查看:
journalctl -u myapp -f
✅ 优点:
适合:需要长期留存日志
目录:
mkdir -p /var/log/myapp
chown myapp:myapp /var/log/myapp
logrotate 配置:
# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
rotate 14
compress
missingok
notifempty
copytruncate
}
例如 Loki:
Golang → 文件 → promtail → Loki
| 路径 | 说明 |
|---|---|
/var/log/syslog |
系统日志 |
/var/log/auth.log |
认证 |
journalctl |
systemd |
journalctl -u myapp --since "1 hour ago"
✅ 推荐组合
Golang (zap/slog)
↓
systemd (journal)
↓
logrotate / Loki / ELK
✅ 不要做的事
如果你愿意,可以告诉我:
我可以直接帮你写一份 完整 Debian + Golang 日志方案。