我在Golang中创建了一个最小的记录器。 我尽量保持简单,但出现了两个问题:
log.Lshortfile
标记的文件名始终显示为logger.go
这是我的代码:
package logger
import (
"log"
"os"
)
var (
dlog = log.New(os.Stdout, "\x1B[36mDEBUG: \x1B[0m", log.Ldate|log.Ltime|log.Lshortfile)
wlog = log.New(os.Stdout, "\x1B[35mWARN: \x1B[0m", log.Ldate|log.Ltime|log.Lshortfile)
ilog = log.New(os.Stdout, "\x1B[32mINFO: \x1B[0m", log.Ldate|log.Ltime|log.Lshortfile)
elog = log.New(os.Stderr, "\x1B[31mERROR: \x1B[0m", log.Ldate|log.Ltime|log.Lshortfile)
)
// Debug Log
func Debug(a ...interface{}) {
dlog.Println(a)
}
// Warn log
func Warn(a ...interface{}) {
wlog.Println(a)
}
// Info Log
func Info(a ...interface{}) {
ilog.Println(a)
}
// Error Log
func Error(a ...interface{}) {
elog.Println(a)
}
我像这样使用它们:logger.Debug("Hello") or logger.Info("There")
如何正确实现?谢谢。
答案 0 :(得分:2)
Println传递一个参数,一个接口{}切片,并使用切片表示法打印它。要解决此问题,请将可变参数传递给函数作为被调用函数的可变参数。
func Debug(a ...interface{}) {
dlog.Println(a...) // <-- note ... here
}
Here's the doc on variadic args
致电Output以解决文件名问题。
func Debug(a ...interface{}) {
dlog.Output(2, fmt.Sprintln(a...))
}