1

Go 中的标准log包不支持与loggingPython 中的标准库不同的级别。

许多包求助于第三方日志包,例如gloglogrus.

导入可能使用或不使用第三方日志包的第三方包时,Go 的最佳日志记录策略是什么。

4

1 回答 1

2

所以,我想你在问,如果我正在使用的包使用普通的旧https://golang.org/pkg/log/而我的主包使用特殊的东西,比如log.Info, log.Warn,log.Errorlog.Debug怎么办?

如果包向您公开了log.Logger对象,您可以使用SetFlags, SetOutput,SetPrefix来更改这些日志消息的外观,或者完全使它们静音,但是您不能使它们与您的特殊第三方日志记录包配合得很好。

例如,如果第三方包如下所示:

package sayhello

import (
      "log"
      "os"
)

type SayHello {
      Logger *log.Logger
}

func NewSayHello() (SayHello) {
      logger, _ := os.OpenFile("/tmp/tmp.log",  os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
      var sh SayHello
      sh.Logger = log.New(logger, "SAY HELLO LOGGER: ", log.Ldate|log.Ltime|log.Lshortfile)
      return sh
}

func (sh SayHello) Run() {
      sh.Logger.Println("Hello. I ran!")
}

然后我可以像这样让它静音:

package main

import (
      "sayhello"
      "io/ioutil"
)

func main() {
      sh := sayhello.NewSayHello()
      sh.Run()
      // output is: 2016/08/10 16:47:46 SAY HELLO LOGGER: Hello. I ran!
      sh.Logger.SetOutput(ioutil.Discard)
      sh.Run()
      // output is nothing
}

但是,您实际上无法将另一个包中的日志语句(例如log.Printlna 中的)翻译成类似log.Info, 或的东西log.Debug,这正是您要寻找的。

于 2016-08-10T21:54:28.100 回答