温馨提示×

golang日志centos怎归档

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

在 CentOS 上做 Golang 应用日志归档,通常有两种思路:

  1. 程序内自己做日志滚动/归档(Go 代码)
  2. 利用 CentOS 系统工具(logrotate)统一归档(推荐)

下面分别说明,并给出常见做法。


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

优点

  • 不用改 Go 代码
  • 系统级统一管理
  • 支持压缩、按天/大小切割、保留天数

1. 假设你的 Go 日志路径

/var/log/myapp/app.log

2. 创建 logrotate 配置

sudo vim /etc/logrotate.d/myapp

内容示例(按天归档,保留 7 天):

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

3. 关键参数说明

参数 作用
daily 每天归档
rotate 7 保留 7 份
compress 压缩旧日志
copytruncate 不重启 Go 程序直接截断日志(非常重要)
notifempty 空日志不处理

⚠️ Go 程序必须一直写同一个日志文件,不要自己 rename 日志

4. 手动测试

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

二、Go 程序内做日志归档(lumberjack)

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

1. 使用 lumberjack

import (
    "gopkg.in/natefinch/lumberjack.v2"
    "log"
)

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

    log.Println("hello")
}

特点

  • 按大小切割
  • 自动压缩
  • 不依赖 CentOS

三、常见坑(很重要)

❌ 错误做法

  • Go 自己 os.Rename 日志文件
  • 然后继续写旧 fd(日志写丢)

✅ 正确做法

  • copytruncate
  • 或 Go 内用 lumberjack
  • 或信号 reload 日志(复杂)

四、结合 systemd(CentOS 7+)

如果你是 systemd 启动:

systemctl status myapp

logrotate 不影响 systemd,只要 copytruncate 即可。


五、总结建议

场景 建议
生产环境 logrotate + copytruncate
容器 / 简单程序 lumberjack
多服务统一 logrotate

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

  • Go 日志怎么写的(stdout / 文件)
  • CentOS 版本
  • 是否用 systemd / docker

我可以给你精确到可直接用的配置

0