在 Linux 下,使用 Golang 进行日志分割的常见方法是使用第三方库,例如 logrus 和 zap。这些库提供了日志分割的功能,可以方便地实现日志文件的自动分割和归档。
以下是使用 logrus 和 zap 进行日志分割的方法:
- 使用 logrus 库进行日志分割:
首先,安装 logrus 库:
go get github.com/sirupsen/logrus
然后,在代码中使用 logrus 并配置日志分割:
package mainimport ( "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 库进行日志分割:
首先,安装 zap 库:
go get go.uber.org/zap
然后,在代码中使用 zap 并配置日志分割:
package mainimport ( "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”。你可以根据自己的需求调整分割时间间隔和日志文件名格式。