我已經(jīng)開始使用 Go 登錄,我遇到了這篇關(guān)于登錄 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)}現(xiàn)在我想向此記錄器生成的日志條目添加一些自定義信息,但它們不是常量字符串文字(如添加到那里INFO:或WARNING:)例如,我想添加觸發(fā)日志的函數(shù)的名稱。假設我有以下功能,我想為此使用:(來自此處)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)}如何將其添加到記錄器?
1 回答

瀟湘沐
TA貢獻1816條經(jīng)驗 獲得超6個贊
最簡單的答案當然是在編寫日志記錄行時輸入它。許多圖書館實際上使用這樣的約定
logger.Logf("myfilename.go:123" + "other logging info")
其中 123 是行號。這也可以由 ide 或編輯器編寫腳本。
如果您更改
_enter()
為返回函數(shù)的名稱,則其余部分將變得更加簡單。您可以logger.SetPrefix()
在每個函數(shù)內(nèi)部調(diào)用,根據(jù)您的示例代碼,它們可能如下所示。Info.SetPrefix("INFO: " + _enter() + ":")
您可以將記錄器包裝在一個有助于自動執(zhí)行上述操作的結(jié)構(gòu)中,但您應該注意
_enter()
每次調(diào)用的開銷。盡管此時,您可能想考慮使用具有更多功能的日志庫。我對logrus有很好的經(jīng)驗,它可以替代標準庫的日志包。
- 1 回答
- 0 關(guān)注
- 238 瀏覽
添加回答
舉報
0/150
提交
取消