温馨提示×

centos golang日志怎么轮

小樊
36
2026-10-06 01:50:29
栏目: 编程语言

在 CentOS 上让 Golang 程序的日志进行轮转(log rotation),常见有 三种做法,从“最推荐”到“最原生”给你讲清楚。


✅ 推荐方式一:程序写单文件 + CentOS 自带 logrotate(最常用)

思路:
Golang 只负责写日志文件(如 /var/log/myapp.log),轮转交给 CentOS 的 logrotate。

1️⃣ Golang 示例(不要用 os.Exit 关闭文件)

package main

import (
	"log"
	"os"
)

func main() {
	f, _ := os.OpenFile("/var/log/myapp.log",
		os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
	defer f.Close()

	log.SetOutput(f)

	for {
		log.Println("running...")
		time.Sleep(time.Second)
	}
}

⚠️ 关键点:

  • 不要自己切文件
  • 使用 O_APPEND
  • 日志文件被 logrotate 重命名后,Golang 还能继续写(或需要信号重新打开)

2️⃣ 配置 logrotate(CentOS 默认已安装)

新建配置文件:

sudo vim /etc/logrotate.d/myapp

内容示例:

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

常用参数说明:

  • daily:每天轮转
  • rotate 7:保留 7 份
  • compress:压缩旧日志
  • copytruncate:不关闭文件直接截断(适合 Golang)

✅ copytruncate 是 Golang 最省心方案


3️⃣ 手动测试

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

✅ 方式二:Golang 自己轮转(不依赖系统)

适合 容器 / 无 logrotate 环境

常用库

  • gopkg.in/natefinch/lumberjack.v2(最流行)

示例

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

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

	log.Println("hello")
}

✅ 优点:

  • 不依赖 CentOS
  • 控制精细

❌ 缺点:

  • 多进程不安全
  • 容器外不推荐

✅ 方式三:systemd + logrotate(CentOS 7+)

如果你用 systemd 管理 Golang 服务:

sudo vim /etc/systemd/system/myapp.service
[Unit]
Description=myapp

[Service]
ExecStart=/opt/myapp/myapp
Restart=always

[Install]
WantedBy=multi-user.target

然后仍然用 logrotate + copytruncate


✅ 总结建议

场景 推荐方案
CentOS 服务器 ✅ logrotate + copytruncate
Docker / K8s ✅ 标准输出 + 容器日志
单进程小工具 ✅ lumberjack
多进程 ❌ 不建议自己切

如果你愿意,我可以:

  • 帮你写 完整 systemd + logrotate 配置
  • 或根据你的 Golang 框架(gin / grpc / beego) 给示例

你现在是 裸 Go / 框架 / 容器 哪种?

0 踩