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  }