温馨提示×

Debian Golang日志怎么轮转

小樊
44
2026-08-11 21:29:47
栏目: 编程语言

在 Debian 上 Golang 程序本身不自带日志轮转(log rotation)功能,通常需要 借助系统工具在程序中实现。下面按 最常用、最推荐 的方式给你讲清楚。


✅ 推荐方案一:使用 Debian 自带的 logrotate(最常用)

这是 生产环境最标准、最简单 的做法。

1️⃣ 让 Golang 程序输出日志到文件

例如:

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)
    }
}

⚠️ 不要自己实现轮转逻辑


2️⃣ 创建 logrotate 配置文件

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 程序最推荐的配置


3️⃣ 测试 logrotate

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

查看结果:

ls -lh /var/log/myapp/

✅ 方案二:Golang 代码内实现日志轮转(不推荐新手)

使用第三方库(如 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 灵活
  • 在 Debian 上不如系统方案标准

✅ Debian 上最佳实践总结

场景 推荐
生产环境 logrotate + 文件日志
Docker / K8s ✅ 输出 stdout,由容器平台处理
简单工具 ✅ lumberjack
高并发服务 ✅ logrotate

✅ 常见坑(很重要)

❌ 不要自己 rename 日志文件

Go 的文件句柄不会自动切换。

✅ 用 copytruncate

避免程序继续写旧文件。

✅ 日志目录权限

sudo mkdir -p /var/log/myapp
sudo chown -R youruser:youruser /var/log/myapp

✅ 一句话总结

Debian 上 Golang 日志轮转:程序只管写文件,轮转交给 logrotate

如果你愿意,我可以 帮你写一个完整的 systemd + logrotate 模板,直接可用。

0