GO日志打印如何添加goroutineid
今天想給日志添加一個前綴,以區(qū)分不同goroutine的日志,方便做并發(fā)問題的排查,做日志跟蹤。
為了解決goroutineid,網(wǎng)上各出奇招,有的使用runtime包未公開的方法獲?。?/p>
func Goid() int {
defer func() {
if err := recover(); err != nil {
fmt.Println("panic recover:panic info:%v", err) }
}()
var buf [64]byte
n := runtime.Stack(buf[:], false)
idField := strings.Fields(strings.TrimPrefix(string(buf[:n]), "goroutine "))[0]
id, err := strconv.Atoi(idField)
if err != nil {
panic(fmt.Sprintf("cannot get goroutine id: %v", err))
}
return id
}如何引用呢?
func setPrefix(level Level) {
_, file, line, ok := runtime.Caller(DefaultCallerDepth)
if ok {
logPrefix = fmt.Sprintf("[%s][%d][%s:%d]", levelFlags[level], Goid(), filepath.Base(file), line)
} else {
logPrefix = fmt.Sprintf("[%s]", levelFlags[level])
}
logger.SetPrefix(logPrefix)
}這個方法我覺得靠譜,顯然runtime包是肯定有獲取協(xié)程id的方法的,因為處理panic時默認(rèn)會輸出問題協(xié)程號。但是這樣做效率會不會有問題,暫時還不清楚。
到此這篇關(guān)于GO日志打印添加goroutineid的文章就介紹到這了,更多相關(guān)GO goroutineid內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
初學(xué)Go必備的vscode插件及最常用快捷鍵和代碼自動補(bǔ)全
golang生成指定位數(shù)的隨機(jī)數(shù)的方法
golang默認(rèn)Logger日志庫在項目中使用Zap日志庫
一個Pod調(diào)度失敗后重新觸發(fā)調(diào)度的所有情況分析

