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

cod*_*y46 7 go

我正在使用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
}
Run Code Online (Sandbox Code Playgroud)

然而,这给出了以下格式的日志:

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

如何编写自定义格式化程序来实现此目的?

tre*_*rex 17

自 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")
}

Run Code Online (Sandbox Code Playgroud)

输出:

INFO[0000]/home/trex/go/src/awesomeProject/main.go:11 main.main() hello world  
Run Code Online (Sandbox Code Playgroud)


小智 6

供参考

\n
log.SetReportCaller(true)\nlog.SetFormatter(&log.JSONFormatter{                                             \n     CallerPrettyfier: func(frame *runtime.Frame) (function string, file string) {                                                     \n        fileName := path.Base(frame.File) + ":" + strconv.Itoa(frame.Line)       \n        //return frame.Function, fileName                                        \n        return "", fileName                                                      \n     },                                                                           \n})\n
Run Code Online (Sandbox Code Playgroud)\n

输出\xef\xbc\x9a

\n
{"file":"inspParse.go:290","level":"info","msg":"(3, 24), ","time":"2021-08-30T16:41:38+08:00"}\n
Run Code Online (Sandbox Code Playgroud)\n


Pau*_*kin 0

您正在使用的包github.com/sirupsen/logrus会生成结构化日志输出:即键/值对。看来您只需要一个纯文本记录器。

标准记录器import "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
Run Code Online (Sandbox Code Playgroud)

在 go1.14 中,额外的标志log.Lmsgprefix将 移动INFO到消息之前,如果这是更可取的(并且您可以等待)。

如果标准库记录器不能满足您的要求(并且您不准备接受它),为什么不直接复制它并编辑它,本质上是制作您自己的日志包?它大约有 400 行简单的代码,当你删除不需要的部分时,它会少很多。

来源在这里: https: //golang.org/src/log/log.go