温馨提示×

debian如何轮转golang日志

小樊
45
2026-09-04 01:48:21
栏目: 编程语言

在 Debian 上“轮转(rotate)Golang 日志”通常有两种思路:

  1. 由外部工具负责轮转(推荐):Golang 程序一直写同一个日志文件,由 logrotate 定期切割、压缩、删除。
  2. 在 Golang 程序内部轮转:使用日志库(如 lumberjack)自动按大小/时间切割。

下面分别说明。


一、使用 logrotate(最常见、最稳定)

1. 安装 logrotate(一般已自带)

sudo apt update
sudo apt install logrotate

2. 示例 Golang 程序(写固定文件)

package main

import (
    "log"
    "os"
)

func main() {
    f, _ := os.OpenFile("/var/log/myapp/app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
    defer f.Close()
    log.SetOutput(f)

    for {
        log.Println("hello")
    }
}

3. 创建 logrotate 配置

sudo vim /etc/logrotate.d/myapp

内容示例:

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

关键点说明:

  • copytruncateGolang 不重开文件时也能生效
  • 如果不加 copytruncate,需要程序支持 SIGHUP 重新打开日志

4. 手动测试

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

二、Golang 内部轮转(lumberjack,推荐新项目)

1. 安装

go get gopkg.in/natemurphy/lumberjack.v2

2. 使用示例

package main

import (
    "log"
    "gopkg.in/natemurphy/lumberjack.v2"
)

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

    for {
        log.Println("hello")
    }
}

优点:

  • 不依赖 logrotate
  • 自动压缩、清理
  • 适合容器 / systemd 环境

三、systemd 环境(journald)

如果你用 systemd:

sudo journalctl -u myapp

可配合:

  • StandardOutput=journal
  • 不用自己写日志文件

总结建议

场景 推荐方案
传统服务器 logrotate + copytruncate
容器 / 云原生 lumberjack
systemd 服务 journald

如果你愿意,我可以:

  • 给你完整的 systemd 配置
  • 帮你写 Docker + 日志轮转方案
  • 针对你的 Golang 框架(gin / zap)做示例

0