我已经开始使用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)
}
如何将其添加到记录器?
答案 0 :(得分:1)
最简单的答案当然是在编写日志记录行时输入。很多图书馆实际上都使用像
这样的约定 logger.Logf("myfilename.go:123" + "other logging info")
其中123是行号。这也是一个ide或编辑器可编写的脚本。
如果更改_enter()
以返回函数的名称,那么这将使其余部分更加简单。您可以在每个函数中调用logger.SetPrefix()
,根据您的示例代码,它可能如下所示。
Info.SetPrefix("INFO: " + _enter() + ":")
您可以将记录器包装在一个有助于自动完成上述操作的结构中,但是您应该知道每个时间调用_enter()
的开销。
虽然此时您可能希望使用具有更多功能的日志记录库。我对logrus有很好的经验,可以替代标准的lib日志包。