在 Debian 上运行 Go 程序时,“日志分割”通常有两种做法:
下面分别说明,并给出常见方案。
lumberjack(最常用)import (
"github.com/gorilla/handlers"
"gopkg.in/natefinch/lumberjack.v2"
"log"
"net/http"
)
func main() {
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 10, // MB
MaxBackups: 5,
MaxAge: 7, // days
Compress: true,
})
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
log.Println("hello")
w.Write([]byte("ok"))
})
http.ListenAndServe(":8080", nil)
}
✅ 优点
✅ 适合
如果你的 Go 程序只是 直接写文件(如 os.OpenFile):
f, _ := os.OpenFile("/var/log/myapp/app.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
log.SetOutput(f)
which logrotate
sudo vim /etc/logrotate.d/myapp
内容示例:
/var/log/myapp/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
copytruncate
}
⚠️ 关键参数说明
copytruncate:不重启程序,复制后清空原文件(Go 程序常用)daily / weekly:分割频率rotate 7:保留 7 份sudo logrotate -d /etc/logrotate.d/myapp
sudo logrotate -f /etc/logrotate.d/myapp
如果你用 systemd:
sudo vim /etc/systemd/system/myapp.service
[Service]
ExecStart=/opt/myapp
StandardOutput=journal
StandardError=journal
查看日志:
journalctl -u myapp
✅ 日志由 systemd 自动管理
❌ 不适合需要长期归档的场景
✅ 最佳实践
lumberjack如果你愿意,可以告诉我:
我可以给你一份可直接用的配置。