logid.go 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package id
  2. import (
  3. "bytes"
  4. "encoding/hex"
  5. "fmt"
  6. "math/rand"
  7. "net"
  8. "os"
  9. "time"
  10. )
  11. var ip_instance string
  12. func getLocalIP() string {
  13. if ip_instance != "" {
  14. return ip_instance
  15. }
  16. ip := "127.0.0.1"
  17. addrs, err := net.InterfaceAddrs()
  18. if err != nil {
  19. ip_instance = ip
  20. return ip
  21. }
  22. for _, a := range addrs {
  23. if ipnet, ok := a.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
  24. if ipnet.IP.To4() != nil {
  25. ip = ipnet.IP.String()
  26. break
  27. }
  28. }
  29. }
  30. ip_instance = ip
  31. return ip
  32. }
  33. func GenLogID() string {
  34. r := rand.New(rand.NewSource(time.Now().UnixMicro()))
  35. ip := getLocalIP()
  36. now := time.Now()
  37. timestamp := uint32(now.Unix())
  38. timeNano := now.UnixNano()
  39. pid := os.Getpid()
  40. b := bytes.Buffer{}
  41. b.WriteString(hex.EncodeToString(net.ParseIP(ip).To4()))
  42. b.WriteString(fmt.Sprintf("%x", timestamp&0xffffffff))
  43. b.WriteString(fmt.Sprintf("%04x", timeNano&0xffff))
  44. b.WriteString(fmt.Sprintf("%04x", pid&0xffff))
  45. b.WriteString(fmt.Sprintf("%06x", r.Int31n(1<<24)))
  46. b.WriteString("b0")
  47. return b.String()
  48. }