温馨提示×

centos golang日志怎么轮转

小樊
47
2026-10-11 23:11:14
栏目: 编程语言

在 CentOS 上,Golang 程序本身的日志轮转(log rotation)一般不靠 Go 代码自己实现,而是由系统工具来完成。常见方案如下:


一、推荐方案:使用 logrotate(最常用)

CentOS 自带 logrotate,非常适合 Go 程序。

1. 假设你的 Go 程序日志路径

/var/log/myapp/app.log

2. 创建 logrotate 配置

sudo vi /etc/logrotate.d/myapp

内容示例:

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

参数说明

  • daily:每天轮转
  • rotate 7:保留 7 份
  • compress:压缩旧日志
  • copytruncate:不重启程序,直接截断原日志(Go 程序常用)
  • dateext:日志带日期

⚠️ 如果 Go 程序用文件句柄写日志,copytruncate 是最安全的


3. 手动测试

sudo logrotate -d /etc/logrotate.d/myapp   # 测试(不真正执行)
sudo logrotate -f /etc/logrotate.d/myapp   # 强制执行

二、Go 程序配合 systemd(推荐生产环境)

如果你的 Go 程序是用 systemd 启动的:

1. service 文件

[Unit]
Description=My Go App

[Service]
ExecStart=/opt/myapp/myapp
Restart=always
StandardOutput=append:/var/log/myapp/app.log
StandardError=append:/var/log/myapp/error.log

[Install]
WantedBy=multi-user.target

2. 仍然用 logrotate

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

三、Go 代码内部实现轮转(不推荐但可选)

如果你不想依赖系统工具,可以用 Go 库:

常用库

  • gopkg.in/natefinch/lumberjack.v2

示例:

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

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

✅ 优点:跨平台
❌ 缺点:日志名不带日期、功能有限


四、方案对比

方案 是否推荐 说明
logrotate ✅✅✅ CentOS 标准做法
systemd + logrotate ✅✅✅ 生产最稳
Go 内部轮转 ⚠️ 小工具可用
自己写轮转 ❌ 没必要

五、总结建议

✅ CentOS + Golang 最佳实践

  • Go 程序:只写文件
  • 日志轮转:logrotate + copytruncate
  • 进程管理:systemd

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

  • Go 是写到 stdout 还是文件?
  • 是否用 systemd / supervisor / docker?

我可以给你一份完全可直接用的配置。

0 踩