在 Debian 上“轮转(rotate)Golang 日志”通常有两种思路:
lumberjack)自动按大小/时间切割。下面分别说明。
sudo apt update
sudo apt install logrotate
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")
}
}
sudo vim /etc/logrotate.d/myapp
内容示例:
/var/log/myapp/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
copytruncate
}
关键点说明:
copytruncate:Golang 不重开文件时也能生效copytruncate,需要程序支持 SIGHUP 重新打开日志sudo logrotate -f /etc/logrotate.d/myapp
go get gopkg.in/natemurphy/lumberjack.v2
package main
import (
"log"
"gopkg.in/natemurphy/lumberjack.v2"
)
func main() {
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 10, // MB
MaxBackups: 7,
MaxAge: 7, // days
Compress: true,
})
for {
log.Println("hello")
}
}
优点:
如果你用 systemd:
sudo journalctl -u myapp
可配合:
StandardOutput=journal| 场景 | 推荐方案 |
|---|---|
| 传统服务器 | logrotate + copytruncate |
| 容器 / 云原生 | lumberjack |
| systemd 服务 | journald |
如果你愿意,我可以: