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

如何使用新功能扩展 log api

如何使用新功能扩展 log api

Go
胡说叔叔 2023-07-26 19:42:42
我将以下代码与 , 一起使用logrus,并且我想扩展它,即在每次使用此 logrus 日志时,它都会默认添加 和 ,function 但file它不起作用我有{  "level": "info",  "msg": "info",  "time": "2019-10-06 17:14:25"}我想{  "file": “myfile.go",  "func": “myfunc:95",  "level": "info",  "msg": "info",  "time": "2019-10-06 17:17:53"}我不是在谈论使用 ReportCaller: true,我只是想用我的功能扩展记录器我该怎么做 ?
查看完整描述

1 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

一种方法是使用WithFieldsandlogrus.Fields像这样:


package main


import (

    "github.com/sirupsen/logrus"

    "os"

    "runtime"

    "strconv"

    "strings"

)


func main() {

    lgr().Log(logrus.InfoLevel, "info")

}


func lgr() *logrus.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:]


    loggerImpl := &logrus.Logger{

        Out:   os.Stdout,

        Hooks: nil,

        Formatter: &logrus.JSONFormatter{

            TimestampFormat: "2006-01-02 15:04:05",

            PrettyPrint:     true,

        },

        Level:    logrus.InfoLevel,

        ExitFunc: nil,

    }


    return loggerImpl.WithFields(logrus.Fields{

        "file":     filename,

        "function": fn,

    })

}


上面的代码*logrus.Entry具有您期望从记录器获得的所有方法。您也可以使用该接口logrus.FieldLogger,但如果这样做,我们将需要坚持该接口上的方法(Log例如没有方法 - 必须使用信息/错误等)。


package main


import (

    "github.com/sirupsen/logrus"

    "os"

    "runtime"

    "strconv"

    "strings"

)


func main() {

    lgr().Infoln("Hello world")

}


func lgr() logrus.FieldLogger {


    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:]


    loggerImpl := &logrus.Logger{

        Out:   os.Stdout,

        Hooks: nil,

        Formatter: &logrus.JSONFormatter{

            TimestampFormat: "2006-01-02 15:04:05",

            PrettyPrint:     true,

        },

        Level:    logrus.InfoLevel,

        ExitFunc: nil,

    }


    return loggerImpl.WithFields(logrus.Fields{

        "file":     filename,

        "function": fn,

    })

}


输出:


{

  "file": "main.go:12",

  "function": "main",

  "level": "info",

  "msg": "Hello world",

  "time": "2019-10-07 01:24:10"

}


查看完整回答
反对 回复 2023-07-26
  • 1 回答
  • 0 关注
  • 116 浏览
慕课专栏
更多

添加回答

举报

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