我正在使用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
如何编写自定义格式化程序来实现此目的?
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")
}
输出:
INFO[0000]/home/trex/go/src/awesomeProject/main.go:11 main.main() hello world  
小智 6
供参考
\nlog.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输出\xef\xbc\x9a
\n{"file":"inspParse.go:290","level":"info","msg":"(3, 24), ","time":"2021-08-30T16:41:38+08:00"}\n您正在使用的包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
在 go1.14 中,额外的标志log.Lmsgprefix将 移动INFO到消息之前,如果这是更可取的(并且您可以等待)。
如果标准库记录器不能满足您的要求(并且您不准备接受它),为什么不直接复制它并编辑它,本质上是制作您自己的日志包?它大约有 400 行简单的代码,当你删除不需要的部分时,它会少很多。
来源在这里: https: //golang.org/src/log/log.go
| 归档时间: | 
 | 
| 查看次数: | 12852 次 | 
| 最近记录: |