在 Debian 上让 Golang 程序日志轮转,常见做法有几种,下面按「推荐程度」给你梳理。
logrotate(最常用)思路:
Golang 程序只管往固定文件写日志(例如 /var/log/myapp.log),轮转交给 Debian 的 logrotate。
package main
import (
"log"
"os"
)
func main() {
f, _ := os.OpenFile("/var/log/myapp.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
defer f.Close()
log.SetOutput(f)
for {
log.Println("hello log")
}
}
创建配置文件:
sudo nano /etc/logrotate.d/myapp
内容示例:
/var/log/myapp.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
copytruncate ✅ 非常重要
daily:每天轮转rotate 7:保留 7 份compress:压缩旧日志sudo logrotate -f /etc/logrotate.d/myapp
✅ 优点
适合 容器 / 无 logrotate 环境
lumberjackgo-file-rotatelogsimport (
"log"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp.log",
MaxSize: 10, // MB
MaxBackups: 7,
MaxAge: 7, // days
Compress: true,
})
log.Println("hello")
}
✅ 优点
❌ 缺点
如果你用 systemd 启动 Go 程序:
[Service]
StandardOutput=journal
StandardError=journal
查看日志:
journalctl -u myapp
⚠️ 不生成文件,不适合需要落盘审计的场景
| 场景 | 推荐方案 |
|---|---|
| Debian 物理机 / 虚拟机 | ✅ logrotate |
| Docker 单容器 | lumberjack |
| K8s | 集中日志系统 |
| systemd 服务 | journald |
如果你愿意,可以告诉我:
我可以给你一份可直接用的配置。