Go 中的标准log
包不支持与logging
Python 中的标准库不同的级别。
许多包求助于第三方日志包,例如glog
或logrus
.
导入可能使用或不使用第三方日志包的第三方包时,Go 的最佳日志记录策略是什么。
所以,我想你在问,如果我正在使用的包使用普通的旧https://golang.org/pkg/log/而我的主包使用特殊的东西,比如log.Info
, log.Warn
,log.Error
和log.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.Println
a 中的)翻译成类似log.Info
, 或的东西log.Debug
,这正是您要寻找的。