@CedmundoMartinez的回答让我头疼了一阵,但也因此想到了(非常简单和相当显而易见,只要我能使用后视镜)的答案。
我在这里发布我的答案,供任何有兴趣寻找类似解决方案的人参考。
我所做的是复制标准日志包(src/log/log.go)并对其进行扩展。通过这种方式,很容易获得一个全局记录器,它已经实现了标准记录器的所有功能,并且可以添加你想要的其他任何功能!在这种情况下,支持级别化记录。
我所做的唯一修改:
type Logger struct {
mu sync.Mutex
prefix string
flag int
out io.Writer
buf []byte
level int
}
只有最后一行是新增的。日志包设置了全局变量std,可以从包中的任何函数中访问结构字段。
接下来,我添加了不同日志级别的常量:
const (
DEBUG = 1 << iota
INFO
ERROR
)
接下来,我添加了我的功能:
(注意:ct是包https://github.com/seago/go-colortext,它允许在Windows上对控制台文本进行着色。因此,这里的所有错误都会以红色打印出来)
func Error(v ...interface{}) {
if std.level <= ERROR {
ct.ChangeColor(ct.Red, true, ct.None, false)
s := fmt.Sprintf("ERROR: %v", v...)
std.Output(2, s)
ct.ResetColor()
}
}
func Info(format string, v ...interface{}) {
if std.level <= INFO {
s := fmt.Sprintf("INFO: "+format, v...)
std.Output(2, s)
}
}
func Debug(v ...interface{}) {
if std.level <= DEBUG {
s := fmt.Sprintf("DEBUG: %v", v...)
std.Output(2, s)
}
}
func SetLogLevel(lvl int) {
std.level = lvl
}
就这样!现在我只需导入修改后的包而不是标准日志包,就可以使用它记录日志了:
import (
"errors"
"tryme/log"
)
func main() {
log.SetLogLevel(log.INFO)
log.Info("This is a test Info")
err := errors.New("This is a test error!!!")
log.Error(err)
log.Debug("Testing debugging")
}
当然,这只是一个演示,可以通过添加更多的日志级别、输出格式等来进一步扩展。
您可以使用标准日志包提供的所有函数,例如SetOutput将日志写入文件或MultiWriter将日志写入文件和控制台等。