温馨提示×

debian golang日志怎么分割

小樊
44
2026-09-01 05:37:12
栏目: 编程语言

在 Debian 上运行 Golang 程序时,“日志分割”通常有两种层面:

  1. 应用层分割(Golang 代码内部分割)
  2. 系统层分割(用 Debian 自带工具,如 logrotate)

下面分别说明,并给出推荐方案。


一、应用层:Golang 自身做日志分割(不依赖系统)

方案 1:使用 lumberjack(最常用)

这是 Go 生态里最成熟的日志切割库。

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

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

    log.Println("hello, world")
}

✅ 优点

  • 不依赖系统
  • 跨平台
  • 按大小自动切割

❌ 缺点

  • 只能按大小,不能按时间(如每天)

方案 2:按时间切割(自己写或用库)

例如每天一个文件:

logFile := fmt.Sprintf("/var/log/myapp/app-%s.log", time.Now().Format("2006-01-02"))

或用第三方库(如 file-rotatelogs)。


二、系统层:Debian + logrotate(推荐)

如果你的 Golang 程序只是 往 stdout 或固定文件写日志,用 logrotate 是最干净的方式。

1. 让程序写文件

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

2. 配置 logrotate

新建配置文件:

sudo nano /etc/logrotate.d/myapp

示例(每天切割,保留 7 天):

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

⚠️ 关键点:

  • copytruncate:适合 不能重载日志文件的 Go 程序
  • 如果程序支持信号重载(如重新打开日志),可用 postrotate

三、Systemd 方式(Debian 10+)

如果你用 systemd 启动 Go 程序:

[Service]
StandardOutput=append:/var/log/myapp/app.log
StandardError=append:/var/log/myapp/error.log

再配合 logrotate 即可。


四、推荐组合(实战)

最佳实践

  • Go 程序:只写日志文件
  • Debian:用 logrotate
  • 若程序不支持重载:加 copytruncate

简单粗暴

  • lumberjack

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

  • Go 程序怎么启动(systemd / docker / 直接运行)
  • 日志是 stdout 还是文件
  • 想按大小还是时间切

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

0