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

时间:2016-04-09 16:22:37

标签: logging go

我已经开始使用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:

例如,我想添加一个触发日志的函数名称。让我们说我有以下功能,我想用它:(来自here

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 个答案:

答案 0 :(得分:1)

  • 最简单的答案当然是在编写日志记录行时输入。很多图书馆实际上都使用像

    这样的约定

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

    其中123是行号。这也是一个ide或编辑器可编写的脚本。

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

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

    您可以将记录器包装在一个有助于自动完成上述操作的结构中,但是您应该知道每个时间调用_enter() 的开销。

  • 虽然此时您可能希望使用具有更多功能的日志记录库。我对logrus有很好的经验,可以替代标准的lib日志包。