在 Debian 上管理 Golang 程序的日志,通常可以从应用层日志方案、系统级日志管理(systemd/journald)、日志轮转(logrotate)以及集中式日志几个层面来做。下面按实用角度说明。
log.SetOutput(os.Stdout)
log.Println("hello")
配合 systemd 捕获 stdout/stderr 即可。
示例(slog):
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
logger.Info("server start", "port", 8080)
✅ 建议:输出到 stdout/stderr,由系统统一收集。
/etc/systemd/system/myapp.service
[Unit]
Description=My Go App
After=network.target
[Service]
ExecStart=/opt/myapp/myapp
WorkingDirectory=/opt/myapp
User=appuser
Restart=on-failure
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
journalctl -u myapp.service
journalctl -u myapp.service -f
journalctl -u myapp.service --since "1 hour ago"
✅ 优点:
如果你必须写日志文件:
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 10, // MB
MaxBackups: 5,
MaxAge: 30,
})
(lumberjack 自动切分)
/etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
copytruncate
}
if env == "prod" {
logger = slog.New(slog.NewJSONHandler(os.Stdout, nil))
} else {
logger = slog.New(slog.NewTextHandler(os.Stdout, nil))
}
适合多服务、多机环境。
| 场景 | 推荐方式 |
|---|---|
| 单服务 | stdout + systemd |
| 写文件 | lumberjack + logrotate |
| 生产环境 | JSON 日志 + journald |
| 多服务 | Loki / ELK |
如果你愿意,可以告诉我:
我可以给你一套完整配置示例。