在 Debian 上运行 Golang 程序时,“日志分割”通常有两种层面:
下面分别说明,并给出推荐方案。
lumberjack(最常用)这是 Go 生态里最成熟的日志切割库。
import (
"gopkg.in/natefinch/lumberjack.v2"
"log"
)
func main() {
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 10, // MB
MaxBackups: 5,
MaxAge: 7, // days
Compress: true,
})
log.Println("hello, world")
}
✅ 优点
❌ 缺点
例如每天一个文件:
logFile := fmt.Sprintf("/var/log/myapp/app-%s.log", time.Now().Format("2006-01-02"))
或用第三方库(如 file-rotatelogs)。
如果你的 Golang 程序只是 往 stdout 或固定文件写日志,用 logrotate 是最干净的方式。
log.SetOutput(os.OpenFile("/var/log/myapp/app.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644))
新建配置文件:
sudo nano /etc/logrotate.d/myapp
示例(每天切割,保留 7 天):
/var/log/myapp/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
copytruncate
}
⚠️ 关键点:
copytruncate:适合 不能重载日志文件的 Go 程序postrotate如果你用 systemd 启动 Go 程序:
[Service]
StandardOutput=append:/var/log/myapp/app.log
StandardError=append:/var/log/myapp/error.log
再配合 logrotate 即可。
✅ 最佳实践
logrotatecopytruncate✅ 简单粗暴
lumberjack如果你愿意,可以告诉我:
我可以给你一份直接可用的配置。