在 CentOS 上运行 Golang 程序时,“日志切分”一般有 三种常见做法,你可以根据场景选一种:
适合: 程序直接把日志写到文件(如 app.log)
package main
import (
"log"
"os"
)
func main() {
f, _ := os.OpenFile("/var/log/myapp/app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
defer f.Close()
log.SetOutput(f)
for {
log.Println("hello")
}
}
新建文件:
/etc/logrotate.d/myapp
内容示例:
/var/log/myapp/app.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
copytruncate:不重启程序就能切日志(Golang 最常用)logrotate -d /etc/logrotate.d/myapp
✅ 优点:不用改代码,稳定
❌ 缺点:依赖外部工具
适合: 不想依赖系统工具
github.com/lestrrat-go/file-rotatelogsgopkg.in/natefinch/lumberjack.v2import (
"gopkg.in/natefinch/lumberjack.v2"
"log"
)
func main() {
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 10, // MB
MaxBackups: 7,
MaxAge: 7, // days
Compress: true,
})
log.Println("hello")
}
✅ 优点:跨平台、可控
❌ 缺点:需要引入依赖
适合: 用 systemd 管理 Golang 服务
log.Println("hello")
[Service]
ExecStart=/opt/myapp/app
StandardOutput=journal
StandardError=journal
journalctl -u myapp -f
✅ 日志自动由 journald 管理
❌ 不适合需要单独日志文件的场景
| 场景 | 推荐 |
|---|---|
| CentOS 服务器 | logrotate |
| 容器 / 跨平台 | lumberjack |
| systemd 服务 | stdout + journald |
如果你愿意,可以告诉我:
我可以给你一套直接可用的配置。