在 Linux 下,使用 Golang 進行日志分割的常見方法是使用第三方庫,例如 logrus 和 zap。這些庫提供了日志分割的功能,可以方便地實現日志文件的自動分割和歸檔。
以下是使用 logrus 和 zap 進行日志分割的方法:
首先,安裝 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)
}
}()
}
首先,安裝 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”。你可以根據自己的需求調整分割時間間隔和日志文件名格式。