linux

Linux 下 Golang 日志如何分割

小樊
48
2025-04-04 08:22:43
栏目: 编程语言

在 Linux 下,使用 Golang 进行日志分割的常见方法是使用第三方库,例如 logrus 和 zap。这些库提供了日志分割的功能,可以方便地实现日志文件的自动分割和归档。

以下是使用 logrus 和 zap 进行日志分割的方法:

  1. 使用 logrus 库进行日志分割:

首先,安装 logrus 库:

go get github.com/sirupsen/logrus

然后,在代码中使用 logrus 并配置日志分割:

package main

import (
	"github.com/sirupsen/logrus"
	"os"
	"time"
)

func main() {
	logrus.SetFormatter(&logrus.JSONFormatter{})
	logrus.SetOutput(os.Stdout)

	logFile, err := os.OpenFile("logs/app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	if err != nil {
		logrus.Fatal(err)
	}

	logrus.SetOutput(logFile)

	hook := logrus.NewHook(logrus.WriterHookOptions{
		Writer: logFile,
		LogLevels: []logrus.Level{
			logrus.InfoLevel,
			logrus.WarnLevel,
			logrus.ErrorLevel,
			logrus.FatalLevel,
			logrus.PanicLevel,
		},
	})

	logrus.AddHook(hook)

	logrus.Info("This is an info message")
	logrus.Warn("This is a warning message")
	logrus.Error("This is an error message")

	// 每天分割日志文件
	ticker := time.NewTicker(24 * time.Hour)
	go func() {
		for range ticker.C {
			logFile.Close()
			os.Rename("logs/app.log", "logs/app-"+time.Now().Format("2006-01-02")+".log")
			logFile, err = os.OpenFile("logs/app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
			if err != nil {
				logrus.Fatal(err)
			}
			logrus.SetOutput(logFile)
		}
	}()
}
  1. 使用 zap 库进行日志分割:

首先,安装 zap 库:

go get go.uber.org/zap

然后,在代码中使用 zap 并配置日志分割:

package main

import (
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"os"
	"time"
)

func main() {
	config := zap.NewProductionConfig()
	config.OutputPaths = []string{"stdout"}
	config.ErrorOutputPaths = []string{"stderr"}

	logger, err := config.Build()
	if err != nil {
		panic(err)
	}
	defer logger.Sync()

	// 每天分割日志文件
	ticker := time.NewTicker(24 * time.Hour)
	go func() {
		for range ticker.C {
			logger.Info("Rotating logs")
			err := logger.Core().Sync()
			if err != nil {
				logger.Error("Failed to rotate logs", zap.Error(err))
			}

			oldLogFile := "logs/app.log"
			newLogFile := "logs/app-" + time.Now().Format("2006-01-02") + ".log"

			err = os.Rename(oldLogFile, newLogFile)
			if err != nil {
				logger.Error("Failed to rename log file", zap.Error(err))
			}

			core, err := zapcore.NewCore(
				zapcore.NewJSONEncoder(config.EncoderConfig),
				zapcore.AddSync(os.Stdout),
				zap.InfoLevel,
			)
			if err != nil {
				logger.Fatal("Failed to create new logger core", zap.Error(err))
			}

			logger = zap.New(zapcore.NewTee(core), zap.AddCaller(), zap.AddStacktrace(zap.ErrorLevel))
		}
	}()

	logger.Info("This is an info message")
	logger.Warn("This is a warning message")
	logger.Error("This is an error message")
}

这两个示例都会在每天午夜自动分割日志文件,并将旧日志文件重命名为 “app-YYYY-MM-DD.log”。你可以根据自己的需求调整分割时间间隔和日志文件名格式。

0
看了该问题的人还看了