Golang日志库使用指南:求指导

Golang日志库使用指南:求指导 大家好,

我正在为我的项目寻找一些关于日志库的指导。需求如下:

  • 日志可以定向到某个文件
  • 日志应该按天轮转。轮转时的文件名应基于日期可配置,以便我们轻松查阅
  • 日志应该能够基于日志文件的大小/行数进行轮转
  • 除了要打印的消息外,还应打印文件名或函数名以及日期时间
  • 应具备日志级别

我尝试使用了 log4go “https://github.com/jeanphorn/log4go”,虽然能收到消息,但对轮转部分不太满意。第2点和第4点功能无法正常工作。

此致 Rajesh

4 回复

我不确定是否理解正确,但如果你还没尝试过 https://github.com/sirupsen/logrus 的话,可以试试看

更多关于Golang日志库使用指南:求指导的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


另外,当你在查看日志时……这个可能会有所帮助 https://godoc.org/github.com/kr/logfmt 表情符号

哦,logrus 默认就支持 logfmt 格式 😉 太棒了

对于你的需求,我推荐使用 lumberjack 配合标准库 log 或第三方库如 logrus 来实现。lumberjack 提供了强大的日志轮转功能,而 logrus 则支持结构化日志和级别。以下是具体实现:

  1. 安装依赖

    go get github.com/sirupsen/logrus
    go get gopkg.in/natefinch/lumberjack.v2
    
  2. 代码示例

    package main
    
    import (
        "os"
        "path/filepath"
        "runtime"
    
        "github.com/sirupsen/logrus"
        "gopkg.in/natefinch/lumberjack.v2"
    )
    
    func main() {
        // 配置 lumberjack 用于日志轮转
        logRotator := &lumberjack.Logger{
            Filename:   "/var/log/myapp/app.log", // 日志文件路径
            MaxSize:    100, // 单个文件最大大小(MB)
            MaxBackups: 30,  // 保留的旧文件最大数量
            MaxAge:     28,  // 保留旧文件的最大天数
            Compress:   true, // 是否压缩旧文件
            LocalTime:  true, // 使用本地时间命名轮转文件
        }
    
        // 配置 logrus
        log := logrus.New()
        log.SetOutput(logRotator) // 设置输出到文件
        log.SetFormatter(&logrus.TextFormatter{
            FullTimestamp:   true, // 显示完整时间戳
            TimestampFormat: "2006-01-02 15:04:05", // 自定义时间格式
            CallerPrettyfier: func(f *runtime.Frame) (string, string) {
                // 获取文件名和函数名,简化路径
                filename := filepath.Base(f.File)
                return "", filename + ":" + f.Function
            },
        })
        log.SetReportCaller(true) // 启用报告调用者信息
    
        // 设置日志级别(例如 InfoLevel)
        log.SetLevel(logrus.InfoLevel)
    
        // 示例日志记录
        log.Info("This is an info message with file and function details.")
        log.Warn("This is a warning message.")
    }
    

关键点说明

  • 日志定向和轮转lumberjack.Logger 处理文件输出和轮转,基于大小(MaxSize)、时间(MaxAge)和备份数量(MaxBackups)。轮转文件会自动按日期命名(如 app-2023-10-05.log),通过 LocalTime: true 使用本地时间。
  • 日志内容logrus.TextFormatter 配置了时间戳和调用者信息(文件名和函数名),通过 SetReportCaller(true) 启用。
  • 日志级别logrus 支持 DebugInfoWarnError 等级别,通过 SetLevel 设置。

如果你偏好标准库,可以使用 log 结合 lumberjack,但需要手动处理级别和格式:

package main

import (
    "log"
    "os"

    "gopkg.in/natefinch/lumberjack.v2"
)

func main() {
    logRotator := &lumberjack.Logger{
        Filename:   "/var/log/myapp/std.log",
        MaxSize:    100,
        MaxBackups: 30,
        MaxAge:     28,
        Compress:   true,
        LocalTime:  true,
    }
    log.SetOutput(logRotator)
    log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile) // 包含日期、时间、文件名
    log.Println("Standard log message with file info.")
}

这使用 log.Lshortfile 来包含文件名和行号,但函数名需要额外处理(标准库不支持直接输出函数名)。

以上方案满足你的所有需求,且轮转可靠。如果遇到问题,检查文件权限和路径是否正确。

回到顶部