温馨提示×

golang日志debian如何分割

小樊
38
2026-09-04 01:51:21
栏目: 编程语言

在 Debian 上运行 Go 程序时,“日志分割”通常有两种做法:

  1. 程序内部分割(Go 代码控制)
  2. 系统级分割(利用 Debian 工具,如 logrotate)

下面分别说明,并给出常见方案。


一、Go 程序内部分割日志(推荐新手)

1. 使用 lumberjack(最常用)

import (
    "github.com/gorilla/handlers"
    "gopkg.in/natefinch/lumberjack.v2"
    "log"
    "net/http"
)

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

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        log.Println("hello")
        w.Write([]byte("ok"))
    })

    http.ListenAndServe(":8080", nil)
}

✅ 优点

  • 不依赖系统
  • 自动按大小切割
  • 自动清理旧日志

✅ 适合

  • systemd 服务
  • 容器
  • 云服务器

二、Debian 系统级日志分割(logrotate)

如果你的 Go 程序只是 直接写文件(如 os.OpenFile):

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

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

which logrotate

2. 创建配置

sudo vim /etc/logrotate.d/myapp

内容示例:

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

⚠️ 关键参数说明

  • copytruncate:不重启程序,复制后清空原文件(Go 程序常用)
  • daily / weekly:分割频率
  • rotate 7:保留 7 份

3. 测试

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

三、systemd + journald(不写文件)

如果你用 systemd:

sudo vim /etc/systemd/system/myapp.service
[Service]
ExecStart=/opt/myapp
StandardOutput=journal
StandardError=journal

查看日志:

journalctl -u myapp

✅ 日志由 systemd 自动管理
❌ 不适合需要长期归档的场景


四、推荐组合(生产环境)

最佳实践

  • Go + lumberjack
  • Go 写 stdout + systemd + logrotate

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

  • 是否用 systemd
  • 日志是 stdout 还是文件
  • Debian 版本

我可以给你一份可直接用的配置

0