在 Debian 下对 Golang 程序日志进行分割,常见有几种方案,从最简单到最规范依次说明。
logrotate适合:所有 Golang 程序(无论用什么日志库)
logrotate 负责:
假设日志文件:
/var/log/myapp/app.log
创建配置文件:
sudo nano /etc/logrotate.d/myapp
内容:
/var/log/myapp/app.log {
daily
rotate 7
missingok
notifempty
compress
delaycompress
copytruncate
}
copytruncate ✅ 非常重要
daily / size 100M 可二选一log.SetOutput(os.OpenFile(
"/var/log/myapp/app.log",
os.O_APPEND|os.O_CREATE|os.O_WRONLY,
0644,
))
lumberjack最常用、最推荐库
go get gopkg.in/natefinish/lumberjack.v2
示例:
import (
"log"
"gopkg.in/natefinish/lumberjack.v2"
)
func main() {
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 100, // MB
MaxBackups: 7,
MaxAge: 7, // days
Compress: true,
})
}
✅ 优点
file-rotatelogsgo get github.com/lestrrat-go/file-rotatelogs
示例:
rl, _ := rotatelogs.New(
"/var/log/myapp/app.%Y%m%d.log",
rotatelogs.WithMaxAge(7*24*time.Hour),
rotatelogs.WithRotationTime(24*time.Hour),
)
log.SetOutput(rl)
✅ 适合
如果你用 systemd:
[Service]
ExecStart=/usr/local/bin/myapp
StandardOutput=append:/var/log/myapp/app.log
StandardError=append:/var/log/myapp/app.log
再配合 logrotate 即可。
| 方案 | 是否需改代码 | 推荐度 |
|---|---|---|
| logrotate | 否 | ⭐⭐⭐⭐⭐ |
| lumberjack | 是 | ⭐⭐⭐⭐⭐ |
| rotatelogs | 是 | ⭐⭐⭐⭐ |
| 自己写 | 是 | ⭐ |
✅ 最佳组合
lumberjacklogrotate如果你愿意,可以告诉我:
我可以给你完整可直接用的配置。