温馨提示×

golang日志centos如何切割

小樊
39
2026-09-15 06:07:00
栏目: 编程语言

在 CentOS 上,Go 语言日志的“切割”通常不推荐在 Go 程序里手写,而是用 系统级日志轮转工具 或 Go 日志库自带切割能力。下面按常见方案给你讲清楚。


一、最推荐方案(CentOS 标准做法):logrotate

适用场景

  • Go 程序直接写文件(如 log.Println 到文件)
  • 使用 zerolog / zap / logrus 写文件
  • 不依赖 Go 内部切割

示例

假设日志文件:

/var/log/myapp/app.log

1. 创建 logrotate 配置

sudo vim /etc/logrotate.d/myapp

内容示例:

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

参数说明

参数 作用
daily 每天切割
rotate 7 保留 7 份
compress 压缩旧日志
copytruncate 不重启程序就切割(Go 常用)

2. 手动测试

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

✅ 这是 CentOS 上最稳定、最推荐的方式


二、Go 代码内部切割(不依赖系统)

1. 使用 lumberjack(最常用)

import "gopkg.in/natefinch/lumberjack.v2"

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

✅ 优点

  • 不依赖 logrotate
  • 跨平台

❌ 缺点

  • 不能和 logrotate 同时使用(会冲突)

2. zap + lumberjack(生产常用)

writer := zapcore.AddSync(&lumberjack.Logger{
    Filename:   "/var/log/myapp/app.log",
    MaxSize:    100,
    MaxBackups: 7,
    MaxAge:     7,
})

三、systemd + journald(不推荐写文件)

如果你用:

journalctl -u myapp

那日志由 systemd 管理,不需要切割文件。


四、常见坑(非常重要)

❌ 同时使用 logrotate + lumberjack

会导致:

  • 日志写丢
  • 文件句柄错乱

✅ 二选一


五、选择建议

场景 推荐
CentOS 服务 logrotate
容器 / 跨平台 lumberjack
简单脚本 logrotate
高并发服务 zap + lumberjack

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

  • 用的哪个日志库(log / zap / logrus / zerolog)
  • 是否 systemd 启动
  • 日志路径

我可以直接给你一份可复制的配置。

0 踩