温馨提示×

centos如何轮转golang日志

小樊
48
2026-09-18 06:40:28
栏目: 编程语言

在 CentOS 上“轮转(rotate)Golang 日志”通常有 两种思路:

  1. 用 Go 程序自己实现日志轮转(不依赖系统)
  2. 用 CentOS 自带的 logrotate 做轮转(推荐,简单稳定)

下面分别说明。


一、推荐方案:使用 logrotate(CentOS 原生)

1. 准备 Golang 日志

让 Go 程序把日志写到固定文件,例如:

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

⚠️ 不要自己切文件,交给 logrotate。


2. 编写 logrotate 配置

新建配置文件:

sudo vi /etc/logrotate.d/myapp

示例内容:

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

参数说明

  • daily:每天轮转
  • rotate 14:保留 14 份
  • compress:压缩旧日志
  • copytruncate:关键,不重启 Go 程序也能继续写
  • notifempty:空文件不轮转

3. 手动测试

sudo logrotate -d /etc/logrotate.d/myapp   # 调试
sudo logrotate -f /etc/logrotate.d/myapp   # 强制执行

二、Go 程序内部轮转(不依赖系统)

适合 容器 / 无 logrotate 环境

方案 1:使用 librato/logrotate(已停更,不推荐)

方案 2:使用 go-file-rotatelogs(常用)

import "github.com/lestrrat-go/file-rotatelogs"

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

log.SetOutput(rl)

✅ 优点:

  • 不依赖系统
  • 自动按时间切割

❌ 缺点:

  • 压缩需自己处理
  • 磁盘清理逻辑要自己写

三、总结建议

场景 推荐方式
CentOS 服务器 ✅ logrotate + copytruncate
Docker / K8s Go 内部轮转 或 不轮转(交给采集)
简单脚本 logrotate

如果你愿意,我可以:

  • 帮你写 完整 Go 日志示例
  • 按你 日志量 / 磁盘大小 定制 logrotate 策略
  • 帮你排查 copytruncate 丢日志问题

直接说你的使用场景即可。

0 踩