温馨提示×

golang日志debian如何轮转

小樊
35
2026-09-10 03:40:08
栏目: 编程语言

在 Debian 上让 Golang 日志轮转,常见做法有下面几种,按“推荐程度”给你说明。


一、最推荐:使用系统 logrotate(不改动 Go 代码)

原则:Go 程序只负责往文件写日志,logrotate 负责切割和清理。

1. Go 代码示例

logFile, _ := os.OpenFile("/var/log/myapp/app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
log.SetOutput(logFile)

不要自己处理轮转


2. 安装 logrotate(Debian 默认已装)

which logrotate

3. 新建 logrotate 配置

sudo vim /etc/logrotate.d/myapp

内容示例:

/var/log/myapp/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    copytruncate
}

关键参数说明

参数 作用
daily 每天轮转
rotate 14 保留 14 份
compress 压缩旧日志
copytruncate 不重启程序即可轮转(Go 最常用

copytruncate 对 Go 程序非常重要


4. 手动测试

sudo logrotate -f /etc/logrotate.d/myapp

二、Go 代码内轮转(不依赖系统)

适合:

  • 容器 / k8s
  • 无 root 权限

推荐库

  • gopkg.in/natefinch/lumberjack.v2(最常用)

示例

import "gopkg.in/natefinch/lumberjack.v2"

log.SetOutput(&lumberjack.Logger{
    Filename:   "/var/log/myapp/app.log",
    MaxSize:    10, // MB
    MaxBackups: 5,
    MaxAge:     28, // days
    Compress:   true,
})

✅ 优点:跨平台
❌ 缺点:压缩/策略不如 logrotate 灵活


三、systemd 环境(推荐组合)

如果你用 systemd 启动 Go 程序:

[Service]
ExecStart=/usr/local/bin/myapp
StandardOutput=append:/var/log/myapp/app.log

再配合 logrotate + copytruncate


四、Docker / Kubernetes 场景

  • 容器内 不要写文件日志
  • 输出到 stdout / stderr
  • 用:
    • Docker log driver
    • k8s logrotate / fluentd / loki

总结建议

场景 方案
普通 Debian 服务 ✅ logrotate + copytruncate
容器 Go + lumberjack / stdout
高可控 systemd + logrotate

如果你愿意,可以告诉我:

  • 是否是 systemd 服务
  • 是否 Docker
  • 日志量大概多大

我可以直接帮你写一份 可用配置

0