温馨提示×

centos怎样轮转golang日志

小樊
36
2026-10-03 03:48:23
栏目: 编程语言

在 CentOS 上“轮转(rotate)Golang 日志”通常不是由 Go 程序自己完成的,而是由 系统日志轮转工具(如 logrotate)来做。下面按常见场景给你讲清楚。


一、推荐方案:用 logrotate 轮转日志(最常用)

1. 前提

你的 Go 程序:

  • 把日志写到固定文件,例如:
    log.SetOutput(os.OpenFile("/var/log/myapp/app.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644))
    
  • 不要自己切文件

2. 编写 logrotate 配置

新建文件:

sudo vi /etc/logrotate.d/myapp

示例配置:

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

参数说明

  • daily:每天轮转
  • rotate 7:保留 7 份
  • compress:压缩旧日志
  • copytruncate:
    • 关键
    • 复制日志后清空原文件
    • Go 程序不需要重启

3. 手动测试

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

查看结果:

ls -lh /var/log/myapp/

二、Go 程序内部轮转(不推荐新手)

1. 使用第三方库

常用库:

  • github.com/lestrrat-go/file-rotatelogs
  • gopkg.in/natefinch/lumberjack.v2

示例(lumberjack)

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

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

✅ 优点:不依赖系统
❌ 缺点:CentOS 运维不统一


三、systemd + logrotate(标准做法)

如果 Go 程序是 systemd 服务:

sudo systemctl edit myapp.service
[Service]
StandardOutput=append:/var/log/myapp/app.log
StandardError=append:/var/log/myapp/error.log

然后还是用 logrotate。


四、常见问题

Q1:Go 日志不轮转?

  • 没用 copytruncate
  • 或 Go 程序持有文件句柄不释放

Q2:轮转后日志不写了?

  • 没用 copytruncate
  • 或程序用 os.Open 而不是 append

五、总结建议

✅ CentOS + Golang 最佳实践

Go 写日志文件 → logrotate 轮转 → copytruncate

如果你愿意,可以:

  • 贴你的 Go 日志代码
  • 或告诉我你是 容器 / systemd / 裸机

我可以直接帮你写完整配置。

0 踩