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

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

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

Go
芜湖不芜 2022-01-04 10:26:18
我已经开始使用 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)}如何将其添加到记录器?
查看完整描述

1 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

  • 最简单的答案当然是在编写日志记录行时输入它。许多图书馆实际上使用这样的约定

    logger.Logf("myfilename.go:123" + "other logging info")

    其中 123 是行号。这也可以由 ide 或编辑器编写脚本。

  • 如果您更改_enter()为返回函数的名称,则其余部分将变得更加简单。您可以logger.SetPrefix()在每个函数内部调用,根据您的示例代码,它们可能如下所示。

    Info.SetPrefix("INFO: " + _enter() + ":")

    您可以将记录器包装在一个有助于自动执行上述操作的结构中,但您应该注意_enter() 每次调用的开销。

  • 尽管此时,您可能想考虑使用具有更多功能的日志库。我对logrus有很好的经验,它可以替代标准库的日志包。


查看完整回答
反对 回复 2022-01-04
  • 1 回答
  • 0 关注
  • 197 浏览
慕课专栏
更多

添加回答

举报

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