为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
侃侃尔雅 2022-05-23 17:24:30
我正在使用github.com/sirupsen/logrus登录我的 golang 脚本,但是我想获取记录消息的文件名和行号。我可以使用以下代码来获得它:package mainimport (    "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如何编写自定义格式化程序来获得这个?
查看完整描述

3 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

自 2018 年底以来,此选项包含在库本身中。


只需将“SetReportCaller”设置为 true。


这是一个例子:


package main


import (

    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  


查看完整回答
反对 回复 2022-05-23
?
繁星coding

TA贡献1797条经验 获得超4个赞

您可以利用下面的代码


package main


import (

    "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.log


2021-11-24 00:49:10,678 - main.go - [line:58] - 信息 - 你好,世界!


查看完整回答
反对 回复 2022-05-23
?
猛跑小猪

TA贡献1858条经验 获得超8个赞

您使用的包会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


查看完整回答
反对 回复 2022-05-23
  • 3 回答
  • 0 关注
  • 396 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信