Golang 中 logrus 的 CustomFormatter 以显示文件名和行号

我正在使用github.com/sirupsen/logrus登录我的 golang 脚本,但是我想获取记录消息的文件名和行号。我可以使用以下代码来获得它:


package main


import (

    "fmt"

    "os"

    "runtime"

    "strings"


    "github.com/sirupsen/logrus"

)


func GetLogger() (*logrus.Logger, *os.File) {

    log := logrus.New()

    log.SetReportCaller(true)


    file, err := os.OpenFile("info.log", os.O_CREATE|os.O_APPEND, 0644)

    if err != nil {

        log.Fatal(err)

    }


    log.Out = file

    log.Formatter = &logrus.TextFormatter{

        CallerPrettyfier: func(f *runtime.Frame) (string, string) {

            repopath := fmt.Sprintf("%s/src/github.com/bob", os.Getenv("GOPATH"))

            filename := strings.Replace(f.File, repopath, "", -1)

            return fmt.Sprintf("%s()", f.Function), fmt.Sprintf("%s:%d", filename, f.Line)

        },

    }


    return log, file

}

但是,这会以以下格式提供日志:


time="2020-04-02T11:43:19+05:30" level=info msg=Hello func="main.main()" file="D:/.../main.go:13"


但我想要的登录格式如下:


Apr 02 00:00:00 INFO main.go:20 : Hello this is a log line


如何编写自定义格式化程序来获得这个?


侃侃尔雅
浏览 397回答 3
3回答

尚方宝剑之说

自 2018 年底以来,此选项包含在库本身中。只需将“SetReportCaller”设置为 true。这是一个例子:package mainimport (    log "github.com/sirupsen/logrus")func main() {    // Add this line for logging filename and line number!    log.SetReportCaller(true)    log.Println("hello world")}输出:INFO[0000]/home/trex/go/src/awesomeProject/main.go:11 main.main() hello world  

繁星coding

您可以利用下面的代码package mainimport (    "bytes"    "fmt"    "github.com/sirupsen/logrus"    "io"    "os"    "strings")type MyFormatter struct {}var levelList = [] string{    "PANIC",    "FATAL",    "ERROR",    "WARN",    "INFO",    "DEBUG",    "TRACE",}func (mf *MyFormatter) Format(entry *logrus.Entry) ([]byte, error){    var b *bytes.Buffer    if entry.Buffer != nil {        b = entry.Buffer    } else {        b = &bytes.Buffer{}    }    level := levelList[int(entry.Level)]    strList := strings.Split(entry.Caller.File, "/")    fileName := strList[len(strList)-1]    b.WriteString(fmt.Sprintf("%s - %s - [line:%d] - %s - %s\n",        entry.Time.Format("2006-01-02 15:04:05,678"), fileName,        entry.Caller.Line, level, entry.Message))    return b.Bytes(), nil}func MakeLogger(filename string, display bool) *logrus.Logger {    f, err := os.OpenFile(filename, os.O_CREATE|os.O_RDWR|os.O_APPEND, 0644)    if err != nil {        panic(err.Error())    }    logger := logrus.New()    if display {        logger.SetOutput(io.MultiWriter(os.Stdout, f))    } else {        logger.SetOutput(io.MultiWriter(f))    }    logger.SetReportCaller(true)    logger.SetFormatter(&MyFormatter{})    return logger}func main()  {    logger := MakeLogger("/tmp/test.log", true)    logger.Info("hello world!")}结果:/tmp/test.log2021-11-24 00:49:10,678 - main.go - [line:58] - 信息 - 你好,世界!

猛跑小猪

您使用的包会github.com/sirupsen/logrus产生结构化的日志输出:即键/值对。看起来您只需要一个纯文本记录器。标准 loggerimport "log"产生的输出非常像你想要log.New(out, "INFO", .Ldate|log.Ltime|log.Lshortfile)的:(参见操场上的https://play.golang.org/p/LKitIwjPuVH )这是示例输出:INFO 2009/11/10 23:00:00 prog.go:10: hello在 go1.14 中,额外的标志log.Lmsgprefix将 移到INFO消息之前,如果这是可取的(你可以等待)。如果标准库记录器不符合您的要求(并且您不准备接受它),为什么不直接复制和编辑它,本质上是制作您自己的日志包?它大约有 400 行简单的代码,当你删除不需要的部分时,它会少很多。来源在这里:https ://golang.org/src/log/log.go
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go