猿问

如何将自定义(非常量)字符串信息添加到日志格式?

我已经开始使用 Go 登录,我遇到了这篇关于登录 Go 的文章https://www.goinggo.net/2013/11/using-log-package-in-go.html


使用以下源代码(略有更改):


var (

  Trace   *log.Logger

  Info    *log.Logger

  Warning *log.Logger

  Error   *log.Logger

)


func Init(

    traceHandle io.Writer,

    infoHandle io.Writer,

    warningHandle io.Writer,

    errorHandle io.Writer) {


    Trace = log.New(traceHandle,

        “TRACE: “,

        log.Ldate|log.Ltime|log.Lshortfile)


    Info = log.New(infoHandle,

        “INFO: “,

        log.Ldate|log.Ltime|log.Lshortfile)


    Warning = log.New(warningHandle,

        “WARNING: “,

        log.Ldate|log.Ltime|log.Lshortfile)


    Error = log.New(errorHandle,

        “ERROR: “,

        log.Ldate|log.Ltime|log.Lshortfile)

}


func main() {

  Init(ioutil.Discard, os.Stdout, os.Stdout, os.Stderr)

}

现在我想向此记录器生成的日志条目添加一些自定义信息,但它们不是常量字符串文字(如添加到那里INFO:或WARNING:)


例如,我想添加触发日志的函数的名称。假设我有以下功能,我想为此使用:(来自此处)


func _enter() {

  // Skip this function, and fetch the PC and file for its parent

  pc, _, _, _ := runtime.Caller(1)

  // Retrieve a Function object this functions parent

  functionObject := runtime.FuncForPC(pc)

  // Regex to extract just the function name (and not the module path)

  extractFnName := regexp.MustCompile(`^.*\.(.*)$`)

  fnName := extractFnName.ReplaceAllString(functionObject.Name(), "$1")

  fmt.Printf("Entering %s\n", fnName)

}

如何将其添加到记录器?


芜湖不芜
浏览 198回答 1
1回答

潇湘沐

最简单的答案当然是在编写日志记录行时输入它。许多图书馆实际上使用这样的约定logger.Logf("myfilename.go:123" + "other logging info")其中 123 是行号。这也可以由 ide 或编辑器编写脚本。如果您更改_enter()为返回函数的名称,则其余部分将变得更加简单。您可以logger.SetPrefix()在每个函数内部调用,根据您的示例代码,它们可能如下所示。Info.SetPrefix("INFO: " + _enter() + ":")您可以将记录器包装在一个有助于自动执行上述操作的结构中,但您应该注意_enter() 每次调用的开销。尽管此时,您可能想考虑使用具有更多功能的日志库。我对logrus有很好的经验,它可以替代标准库的日志包。
随时随地看视频慕课网APP

相关分类

Go
我要回答