centos

CentOS下Golang日志如何切割

小樊
41
2025-11-03 18:09:48
栏目: 编程语言

在 CentOS 系统下,使用 Golang 进行日志切割可以通过以下几种方法实现:

  1. 使用第三方日志库

有许多第三方日志库提供了日志切割功能,例如 logrus、zap 等。这些库通常会提供日志切割、日志级别、日志格式等功能。你可以根据自己的需求选择合适的库。

以 logrus 为例,你可以使用 logrus 的 hooks 库来实现日志切割:

package main

import (
	"github.com/sirupsen/logrus"
	"github.com/lestrrat-go/file-rotatelogs"
	"time"
)

func main() {
	log := logrus.New()

	// 设置日志级别
	log.SetLevel(logrus.InfoLevel)

	// 设置日志切割
	log.SetReportCaller(true)
	log.SetFormatter(&logrus.JSONFormatter{})
	log.Out = rotatelogs.New(
		"/var/log/myapp.log.%d{yyyy-MM-dd}.gz",
		rotatelogs.WithLinkName("/var/log/myapp.log"),
		rotatelogs.WithRotationTime(24*time.Hour),
	)

	log.Info("This is an info log")
}
  1. 使用系统日志服务

你可以将 Golang 应用的日志输出到系统日志服务,例如 syslog 或 journald。这样,你可以使用系统自带的日志切割工具(例如 logrotate)来管理日志。

以 syslog 为例,你可以使用 go-syslog 库将日志输出到 syslog:

package main

import (
	"github.com/RackSec/srs-lib-go/log"
)

func main() {
	log.SetLogger("srs.log", log.LOG_INFO|log.LOG_NOTICE|log.LOG_ALERT|log.LOG_CRIT|log.LOG_ERR|log.LOG_WARNING|log.LOG_DEBUG, log.LOG_PID)
	log.Info("This is an info log")
}

然后,你可以配置 logrotate 来实现日志切割:

/var/log/srs.log {
    daily
    missingok
    rotate 7
    compress
    notifempty
    create 640 root adm
}
  1. 自定义日志切割

如果你不想使用第三方库或系统日志服务,你可以在 Golang 应用中实现自定义的日志切割功能。例如,你可以定期检查日志文件的大小,并在达到指定大小时创建一个新的日志文件。

以下是一个简单的示例:

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"time"
)

const maxLogSize = 10 * 1024 * 1024 // 10 MB

func main() {
	logFile, err := os.OpenFile("myapp.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	if err != nil {
		log.Fatalf("Failed to open log file: %v", err)
	}
	defer logFile.Close()

	logger := log.New(logFile, "", log.LstdFlags)

	for {
		info, err := logFile.Stat()
		if err != nil {
			log.Fatalf("Failed to get log file info: %v", err)
		}

		if info.Size() > maxLogSize {
			logFile.Close()

			for i := 9; i >= 1; i-- {
				src := fmt.Sprintf("myapp.log.%d", i)
				dst := fmt.Sprintf("myapp.log.%d.bak", i+1)
				os.Rename(src, dst)
			}

			os.Rename("myapp.log", "myapp.log.1")
			logFile, err = os.OpenFile("myapp.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
			if err != nil {
				log.Fatalf("Failed to open log file: %v", err)
			}
		}

		logger.Println("This is an info log")
		time.Sleep(1 * time.Second)
	}
}

这个示例中,我们创建了一个名为 myapp.log 的日志文件,并定期检查其大小。当文件大小超过 10 MB 时,我们会将当前日志文件重命名为 myapp.log.1,并创建一个新的空日志文件。

0
看了该问题的人还看了