在 CentOS 上,Golang 程序日志分割常见有 三种方式:
lumberjack(最常用)Golang 官方推荐方案之一,配合 logrus / zap / slog 使用。
安装
go get gopkg.in/natefinch/lumberjack.v2
示例(搭配标准 log)
import (
"log"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 100, // MB
MaxBackups: 7, // 保留旧文件数
MaxAge: 30, // 天数
Compress: true, // 压缩
})
log.Println("hello")
}
✅ 优点:
logrotate(CentOS 原生)适合 已有日志文件 的场景。
log.SetOutput(os.OpenFile("/var/log/myapp/app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644))
sudo vim /etc/logrotate.d/myapp
内容示例:
/var/log/myapp/*.log {
daily
rotate 7
missingok
notifempty
compress
copytruncate
}
copytruncate很关键:不重启程序直接截断日志
sudo logrotate -d /etc/logrotate.d/myapp
sudo logrotate -f /etc/logrotate.d/myapp
如果你用 systemd 启动 Go 程序:
[Unit]
Description=My Go App
[Service]
ExecStart=/opt/myapp/app
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
日志查看:
journalctl -u myapp -f
systemd 自动管理日志大小。
| 场景 | 推荐方案 |
|---|---|
| 新项目 | lumberjack |
| 已有程序 | logrotate |
| 运维统一 | systemd journal |
如果你愿意,可以告诉我:
我可以给你一套 完整可直接用的配置。