在 Debian 上 Golang 程序本身不自带日志轮转(log rotation)功能,通常需要 借助系统工具 或 在程序中实现。下面按 最常用、最推荐 的方式给你讲清楚。
logrotate(最常用)这是 生产环境最标准、最简单 的做法。
例如:
package main
import (
"log"
"os"
)
func main() {
f, err := os.OpenFile("/var/log/myapp/app.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
if err != nil {
panic(err)
}
defer f.Close()
log.SetOutput(f)
for {
log.Println("hello, world")
time.Sleep(5 * time.Second)
}
}
⚠️ 不要自己实现轮转逻辑
sudo nano /etc/logrotate.d/myapp
内容示例:
/var/log/myapp/app.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0644 root root
copytruncate
}
| 参数 | 作用 |
|---|---|
daily |
每天轮转 |
rotate 7 |
保留 7 个备份 |
compress |
压缩旧日志 |
copytruncate |
不重启程序,直接截断文件(对 Go 很友好) |
missingok |
日志不存在也不报错 |
✅ 这是 Go 程序最推荐的配置
sudo logrotate -f /etc/logrotate.d/myapp
查看结果:
ls -lh /var/log/myapp/
lumberjack)import (
"log"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 10, // MB
MaxBackups: 7,
MaxAge: 30, // days
Compress: true,
})
log.Println("hello")
}
| 场景 | 推荐 |
|---|---|
| 生产环境 | ✅ logrotate + 文件日志 |
| Docker / K8s | ✅ 输出 stdout,由容器平台处理 |
| 简单工具 | ✅ lumberjack |
| 高并发服务 | ✅ logrotate |
Go 的文件句柄不会自动切换。
copytruncate避免程序继续写旧文件。
sudo mkdir -p /var/log/myapp
sudo chown -R youruser:youruser /var/log/myapp
Debian 上 Golang 日志轮转:程序只管写文件,轮转交给
logrotate
如果你愿意,我可以 帮你写一个完整的 systemd + logrotate 模板,直接可用。