相关疑难解决方法(0)

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
}
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 …

go

7
推荐指数
3
解决办法
1万
查看次数

如何准确标记错误以符合golang

我似乎有这个答案并使用@OneOfOne 答案。 你如何让 Golang 程序打印它刚刚调用的错误的行号?

但是有一些问题。

func FancyHandleError(err error) (b bool) {
    if err != nil {
        pc, fn, line, _ := runtime.Caller(1)
        log.Printf("[error] in %s[%s:%d] %v", runtime.FuncForPC(pc).Name(), fn, line, err)
        b = true
    }
    return
}

func main(){
    FancyHandleError?funcA())
}

func funcA()error{
    err := funcB()
    return err
}

func funcB()error{
    err := funcC()
    return err
}

func funcC()error{
    err := errors.New("deep errors!!") //I want to get the location in here!!!!!!!!!!!!!!!!!!!!!!
    return err
}
Run Code Online (Sandbox Code Playgroud)

它将打印“ [error] in main.main[/root/temp/error.go:23] ”,这是在函数 main …

go

-3
推荐指数
1
解决办法
1202
查看次数

标签 统计

go ×2