温馨提示×

centos golang日志如何切割

小樊
42
2026-09-09 03:55:43
栏目: 编程语言

在 CentOS 上给 Golang 程序做日志切割,常见有 三种方案,从简单到生产级分别是:


一、Golang 代码内切割(推荐用 libraty)

1️⃣ 使用 lumberjack(最常用)

这是 Go 生态里最主流的日志切割方案,常配合 logrus / zap / slog。

安装

go get gopkg.in/natefinch/lumberjack.v2

示例(zap + lumberjack)

import (
    "go.uber.org/zap"
    "go.uber.org/zap/zapcore"
    "gopkg.in/natefinch/lumberjack.v2"
)

func main() {
    w := zapcore.AddSync(&lumberjack.Logger{
        Filename:   "/var/log/myapp/app.log",
        MaxSize:    100, // MB
        MaxBackups: 10,
        MaxAge:     30,  // days
        Compress:   true,
    })

    core := zapcore.NewCore(
        zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),
        w,
        zap.InfoLevel,
    )

    logger := zap.New(core)
    defer logger.Sync()

    logger.Info("hello world")
}

✅ 优点

  • 不依赖系统
  • 切割逻辑稳定
  • 支持大小 / 数量 / 时间 / 压缩

二、使用 CentOS 系统工具 logrotate

适合 直接写文件 的 Go 程序(如 log.Println)

1️⃣ 写日志到文件

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

2️⃣ 配置 logrotate

sudo vim /etc/logrotate.d/myapp

内容示例:

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

⚠️ 关键参数说明

  • copytruncate:不重启进程直接截断日志(Go 程序必须加)
  • daily:按天
  • compress:压缩旧日志

3️⃣ 测试

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

✅ 优点

  • 系统级成熟方案
  • 不改动 Go 代码

❌ 缺点

  • 必须 copytruncate
  • 切割精度不如代码级

三、使用 systemd 的日志(journald)

如果你用 systemd 启动 Go 程序:

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

查看日志:

journalctl -u myapp -f

可配合:

journalctl --vacuum-size=500M

✅ 适合容器 / 云环境
❌ 不适合需要长期落盘分析的场景


四、方案对比

方案 是否改代码 精确度 推荐场景
lumberjack ✅ 高 生产环境首选
logrotate ❌ 中 老项目 / 简单服务
journald ❌ 低 容器 / systemd

五、推荐组合(生产最佳实践)

✅ Golang + zap + lumberjack + 不大依赖 logrotate

如果你的程序是直接 fmt/log 输出,就用 logrotate + copytruncate


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

  • 用的日志库(log / logrus / zap / slog)
  • 是否 systemd 启动
  • 按大小还是按天切

我可以直接给你 完整可运行配置。

0 踩