在 Debian 上运行 Golang 程序时,“日志怎么切”通常指日志轮转(log rotation),常见做法有两类:
适合场景:Golang 直接写文件(如 os.OpenFile 写 app.log)
f, _ := os.OpenFile("/var/log/myapp/app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
log.SetOutput(f)
sudo nano /etc/logrotate.d/myapp
内容示例:
/var/log/myapp/*.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
copytruncate:不重启程序就能切日志(Golang 最常用)copytruncate:程序需支持 SIGHUP 重新打开日志sudo logrotate -f /etc/logrotate.d/myapp
适合场景:容器、无 root 权限、自定义规则
import "gopkg.in/natefinch/lumberjack.v2"
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 10, // MB
MaxBackups: 7,
MaxAge: 7, // days
Compress: true,
})
✅ 自动切、自动压缩
❌ 日志文件名不带日期
如果你是 systemd 启动 Golang:
[Service]
ExecStart=/usr/local/bin/myapp
StandardOutput=journal
然后用:
journalctl -u myapp
由 journald 管理日志
| 场景 | 推荐方式 |
|---|---|
| 服务器长期运行 | logrotate + copytruncate |
| 容器 | lumberjack |
| systemd 服务 | journald |
| 多服务统一 | filebeat + logrotate |
如果你愿意,可以告诉我:
我可以给你精确配置。