Как получить имя файла и функции для регистраторов - PullRequest
1 голос
/ 02 октября 2019

Я использую logrus ОС, которая работает как положено, теперь у нас есть требование добавить к выходу регистратора файл и функцию, с которой вы вызываете вызов регистратора,

нам нужно, чтобы это было что-то вроде

Файл log-ut-usage

func main(){


  logs := lts.InitLogger("test","1","debug")

  logs.Debugf("test 123")
....

}

Это требуемый вывод


{"file":"log-ut-usage/main.go:21","function":"main","level":"warn","test 123":"ddd","timestamp":"2019-10-02T09:21:39.309559Z"}

в настоящее время мы получилифайл и функция

файл logger.go

func InitLog(label string) LoggerI {

loggerImpl = &logrus.Logger{
        Out:          os.Stdout,
        Level:        level,
        ReportCaller: true,
        Formatter: &logrus.JSONFormatter{
            TimestampFormat: timestampFormat,
            CallerPrettyfier: func(f *runtime.Frame) (string, string) {
                s := strings.Split(f.Function, ".")
                funcname := s[len(s)-1]
                _, filename := path.Split(f.File)
                return funcname, filename
            },
        },
    }

Это (нежелательный) вывод

{"file":"logger.go","func":"InitLog","level":"debug","msg":"test 123","time":"2019-10-02 12:21:39"}

Я не хочучтобы получить файл logger.go, в котором мы закодировали форматер json, я хочу получить файл с использованием регистратора.

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Вы можете обернуть свой регистратор информацией о файле, функции и строке, а затем использовать ее.

Вот пример ( live ):

package main

import (
    "os"
    "runtime"
    "strconv"
    "strings"

    log "github.com/sirupsen/logrus"
)

func init() {
    log.SetFormatter(&log.JSONFormatter{})
    log.SetOutput(os.Stdout)
}

func logger() *log.Entry {
    pc, file, line, ok := runtime.Caller(1)
    if !ok {
        panic("Could not get context info for logger!")
    }

    filename := file[strings.LastIndex(file, "/")+1:] + ":" + strconv.Itoa(line)
    funcname := runtime.FuncForPC(pc).Name()
    fn := funcname[strings.LastIndex(funcname, ".")+1:]
    return log.WithField("file", filename).WithField("function", fn)
}

func test() {
    logger().Info("Testing...")
}

func main() {
    logger().Info("Testing...")
    test()
}

Вывод :

{"file":"prog.go:34","function":"main","level":"info","msg":"Testing...","time":"2009-11-10T23:00:00Z"}
{"file":"prog.go:30","function":"test","level":"info","msg":"Testing...","time":"2009-11-10T23:00:00Z"}
0 голосов
/ 02 октября 2019

Вы пытались использовать debug.Stack () для получения имени файла, который вызывает InitLog?

https://play.golang.org/p/g6yLGsiuEEn

goroutine 1 [running]:
runtime/debug.Stack(0x15d6b0, 0x3, 0x68360, 0x1580)
    /usr/local/go/src/runtime/debug/stack.go:24 +0xc0
main.fun2()
    /tmp/sandbox834348417/prog.go:20 +0x20
main.fun1(...)
    /tmp/sandbox834348417/prog.go:15
main.main()
    /tmp/sandbox834348417/prog.go:10 +0x20

Надеюсь, что это работает.

...