Golang标准库log模块是否支持日志轮转

Golang标准库log模块是否支持日志轮转 大家好,

我正在尝试使用标准日志模块将日志条目保存到文件中。

  1. 它支持日志轮转吗?例如:mylog1.txt、mylog2.txt、mylog3.txt……,每个文件大小为10M。在我的代码片段中,它写入的是单个日志文件,并且该文件已经达到3.1G了。
  2. 它支持日志级别吗?例如:log.info、log.error……?

谢谢

package main

import (
	"log"
	"os"
)

func main() {
	var logfilename = "/Users/ljh/Documents/helloGo/mylog.txt"
	log.SetFlags(log.LstdFlags | log.Lshortfile)
	var logfile, err = os.OpenFile(logfilename, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
	if err != nil {
		log.Fatalf("OpenFile: %v", err)
	}
	defer logfile.Close()
	log.SetOutput(logfile)

	// for {
		log.Println("Hello World")
		//...
	//}
}


更多关于Golang标准库log模块是否支持日志轮转的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

Glog 似乎不支持 JSON 日志记录。

更多关于Golang标准库log模块是否支持日志轮转的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


感谢诺伯特,

与位于 Go 语言目录下的 glog 相比,zap 表现如何?

ljh:

它支持日志轮转吗?例如:mylog1.txt、mylog2.txt、mylog3.txt……,并且每个文件大小为10M。在我的代码片段中,它正在写入单个日志文件,该文件已经达到3.1G。

不支持,并且应该由外部工具来处理,这些工具是经过实战检验的……最著名的例子是 logrotate 和 systemd。

ljh:

它支持日志级别吗,例如:log.info、log.error……?

某种程度上支持。它支持普通和致命两个日志级别。

如果你的需求更多,那么你需要寻找另一个日志记录器。由于我一直是JSON日志的爱好者,每当我在Go项目中需要日志记录时,我都会使用 zap

标准库的 log 模块不支持日志轮转和日志级别。它是一个轻量级的日志记录器,主要提供基本的日志功能。

对于日志轮转,你需要使用第三方库或自己实现。以下是使用 lumberjack 库实现日志轮转的示例:

package main

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

func main() {
    log.SetOutput(&lumberjack.Logger{
        Filename:   "/Users/ljh/Documents/helloGo/mylog.txt",
        MaxSize:    10, // 文件最大大小(MB)
        MaxBackups: 3,  // 保留的旧文件最大数量
        MaxAge:     28, // 保留旧文件的最大天数
        Compress:   true, // 是否压缩旧文件
    })
    
    log.Println("Hello World")
}

对于日志级别,标准库 log 不直接支持。你可以使用 log.Printf 配合前缀来模拟:

package main

import (
    "log"
    "os"
)

const (
    LevelInfo  = "INFO"
    LevelError = "ERROR"
)

func main() {
    log.SetOutput(os.Stdout)
    log.SetFlags(log.LstdFlags)
    
    log.Printf("[%s] %s", LevelInfo, "This is an info message")
    log.Printf("[%s] %s", LevelError, "This is an error message")
}

或者使用更完整的日志库如 logrus

package main

import (
    "github.com/sirupsen/logrus"
    "gopkg.in/natefinch/lumberjack.v2"
)

func main() {
    logger := logrus.New()
    logger.SetOutput(&lumberjack.Logger{
        Filename:   "/Users/ljh/Documents/helloGo/mylog.txt",
        MaxSize:    10,
        MaxBackups: 3,
        MaxAge:     28,
        Compress:   true,
    })
    
    logger.Info("This is an info message")
    logger.Error("This is an error message")
}

logrus 提供了完整的日志级别(Debug、Info、Warn、Error、Fatal、Panic)和结构化日志支持。

回到顶部