在 CentOS 上,Golang 日志切割常见有 三种方式:
1️⃣ 程序内切割(Go 代码)
2️⃣ 使用 Linux 自带的 logrotate
3️⃣ 使用第三方日志库自动切割
下面分别说明,并给出推荐方案。
适合:所有 Go 程序(不管用什么日志库)
which logrotate
/var/log/myapp/*.log新建配置:
sudo vi /etc/logrotate.d/myapp
内容示例:
/var/log/myapp/*.log {
daily
rotate 30
missingok
notifempty
compress
delaycompress
copytruncate
dateext
}
daily:每天切割rotate 30:保留 30 份compress:压缩旧日志copytruncate:不重启 Go 程序就能切割(很重要)dateext:日志加日期后缀sudo logrotate -f /etc/logrotate.d/myapp
✅ Go 程序无需感知日志切割
适合:不想依赖系统工具
lumberjackgo get gopkg.in/natefinch/lumberjack.v2
import (
"log"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 100, // MB
MaxBackups: 30,
MaxAge: 28, // days
Compress: true,
})
log.Println("hello")
}
✅ 自动按大小切割
❌ 按时间切割不太灵活
zap + lumberjack(非常推荐)logrus + rotatelogswriter := zapcore.AddSync(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 100,
MaxBackups: 30,
MaxAge: 30,
})
core := zapcore.NewCore(
zapcore.JSONEncoder,
writer,
zap.InfoLevel,
)
logger := zap.New(core)
如果你用 systemd 启动 Go 程序:
[Service]
ExecStart=/usr/local/bin/myapp
StandardOutput=append:/var/log/myapp/app.log
⚠️ 不要用 StandardOutput=syslog 再自己切
| 场景 | 推荐方式 |
|---|---|
| 生产环境 | ✅ logrotate |
| 容器 / K8s | 程序内 lumberjack |
| 简单脚本 | logrotate |
| 高性能日志 | zap + lumberjack |
如果你愿意,可以告诉我:
我可以直接给你一份可用的配置。