温馨提示×

debian中golang日志如何分割

小樊
46
2026-09-22 09:46:31
栏目: 编程语言

在 Debian 下对 Golang 程序日志进行分割,常见有几种方案,从最简单到最规范依次说明。


一、最推荐(生产环境):使用 logrotate

适合:所有 Golang 程序(无论用什么日志库)

1. 基本思路

  • Golang 程序 直接写文件
  • 由 Debian 自带的 logrotate 负责:
    • 按大小 / 时间切割
    • 压缩
    • 删除旧日志

2. 示例

假设日志文件:

/var/log/myapp/app.log

创建配置文件:

sudo nano /etc/logrotate.d/myapp

内容:

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

3. 关键点说明

  • copytruncate ✅ 非常重要
    • Golang 默认不会重新打开日志文件
    • 该参数可避免重启程序
  • daily / size 100M 可二选一

4. Golang 示例

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

二、Golang 内部自动分割(不依赖系统)

方案 1:使用 lumberjack

最常用、最推荐库

go get gopkg.in/natefinish/lumberjack.v2

示例:

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

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

✅ 优点

  • 不依赖系统
  • 自动压缩、清理
  • 生产常用

三、按时间切割(如每天一个文件)

方案:file-rotatelogs

go get github.com/lestrrat-go/file-rotatelogs

示例:

rl, _ := rotatelogs.New(
    "/var/log/myapp/app.%Y%m%d.log",
    rotatelogs.WithMaxAge(7*24*time.Hour),
    rotatelogs.WithRotationTime(24*time.Hour),
)

log.SetOutput(rl)

✅ 适合

  • 按天分析日志
  • ELK / 日志采集系统

四、使用 systemd + logrotate(标准服务)

如果你用 systemd:

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

再配合 logrotate 即可。


五、方案对比

方案 是否需改代码 推荐度
logrotate 否 ⭐⭐⭐⭐⭐
lumberjack 是 ⭐⭐⭐⭐⭐
rotatelogs 是 ⭐⭐⭐⭐
自己写 是 ⭐

六、推荐组合(实战)

✅ 最佳组合

  • Golang + lumberjack
  • 或
  • Golang 写文件 + Debian logrotate

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

  • 用的什么日志库(log / zap / logrus)
  • 是否 systemd 启动
  • 按大小还是按时间切

我可以给你完整可直接用的配置。

0 踩