在 Debian 上,Golang 程序本身不会自动分割日志,通常需要借助外部工具或日志库来实现日志分割。下面按常见方案给你讲清楚。
适合: 所有 Golang 程序(无论用什么日志库)
/var/log/myapp/app.log
sudo vim /etc/logrotate.d/myapp
内容示例:
/var/log/myapp/*.log {
daily
rotate 7
missingok
notifempty
compress
delaycompress
copytruncate
}
daily:每天分割rotate 7:保留 7 份compress:压缩旧日志copytruncate:关键,不重启 Go 程序也能继续写日志sudo logrotate -f /etc/logrotate.d/myapp
✅ 优点
适合: 想让程序自己管理日志
import (
"gopkg.in/natefinch/lumberjack.v2"
"go.uber.org/zap"
)
logger := zap.New(zapcore.NewCore(
zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),
zapcore.AddSync(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 10, // MB
MaxBackups: 7,
MaxAge: 7, // days
Compress: true,
}),
zap.InfoLevel,
))
✅ 优点
❌ 缺点
如果你用 systemd 启动 Go 程序:
StandardOutput=append:/var/log/myapp/app.log
但 systemd 不会自动切割日志,仍需 logrotate。
| 场景 | 推荐方式 |
|---|---|
| 生产服务 | ✅ logrotate |
| 容器 / 跨平台 | ✅ lumberjack |
| 简单脚本 | logrotate |
如果你愿意,可以告诉我:
我可以帮你写一份可直接用的配置。