github.com/artisanhe/tools@v1.0.1-0.20210607022958-19a8fef2eb04/log/context/log_id.go (about) 1 package context 2 3 import ( 4 "bytes" 5 "runtime" 6 "strconv" 7 "sync" 8 ) 9 10 var ( 11 logIDs = map[int64]string{} 12 locker = sync.RWMutex{} 13 ) 14 15 //func getGoID() int64 { 16 //return runtime.GoID() 17 //} 18 19 func getGoID() int64 { 20 b := make([]byte, 64) 21 b = b[:runtime.Stack(b, false)] 22 b = bytes.TrimPrefix(b, []byte("goroutine")) 23 b = b[:bytes.IndexByte(b, ' ')] 24 n, _ := strconv.ParseUint(string(b), 10, 64) 25 return int64(n) 26 } 27 28 func SetLogID(id string) { 29 locker.Lock() 30 defer locker.Unlock() 31 32 logIDs[getGoID()] = id 33 } 34 35 func GetLogID() string { 36 locker.RLock() 37 defer locker.RUnlock() 38 39 goID := getGoID() 40 41 if logID, ok := logIDs[goID]; ok { 42 return logID 43 } 44 45 return "" 46 } 47 48 func Close() { 49 locker.Lock() 50 defer locker.Unlock() 51 52 goID := getGoID() 53 54 if _, ok := logIDs[goID]; ok { 55 delete(logIDs, goID) 56 } 57 }