在 Debian 上“轮转 Golang 日志”通常有两层意思,下面分别说明常见做法。
如果你是用 Go 写的服务(如 log、log/slog、zap、logrus 等),最规范的做法是让程序支持日志轮转,而不是依赖系统。
lumberjack(最常用)import (
"gopkg.in/natefinch/lumberjack.v2"
"log"
)
func main() {
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 10, // MB
MaxBackups: 7,
MaxAge: 30, // days
Compress: true,
})
}
特点:
wc := zapcore.AddSync(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 50,
Compress: true,
})
如果你的 Go 程序直接写文件(如 /var/log/myapp.log),用 logrotate 管理。
sudo nano /etc/logrotate.d/myapp
示例:
/var/log/myapp/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
copytruncate
}
copytruncate:非常重要,避免 Go 程序因文件句柄不释放而继续写旧文件daily / weekly:轮转周期rotate N:保留份数compress:压缩旧日志sudo logrotate -d /etc/logrotate.d/myapp # 模拟
sudo logrotate -f /etc/logrotate.d/myapp # 强制执行
如果 Go 程序直接输出到 stdout:
# /etc/systemd/system/myapp.service
[Service]
ExecStart=/usr/local/bin/myapp
StandardOutput=journal
查看:
journalctl -u myapp
journald 自带轮转(由 SystemMaxUse 控制)。
| 场景 | 推荐方式 |
|---|---|
| Go 服务长期运行 | lumberjack |
| 简单脚本 / legacy | logrotate + copytruncate |
| 容器 / systemd | stdout + journald |
如果你愿意,可以告诉我:
我可以给你一份可直接用的配置。