Files
PMail/server/utils/id/logid.go
2023-09-09 17:57:15 +08:00

58 lines
1.0 KiB
Go

package id
import (
"bytes"
"encoding/hex"
"fmt"
"math/rand"
"net"
"os"
"time"
)
var ip_instance string
func getLocalIP() string {
if ip_instance != "" {
return ip_instance
}
ip := "127.0.0.1"
addrs, err := net.InterfaceAddrs()
if err != nil {
ip_instance = ip
return ip
}
for _, a := range addrs {
if ipnet, ok := a.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
if ipnet.IP.To4() != nil {
ip = ipnet.IP.String()
break
}
}
}
ip_instance = ip
return ip
}
func GenLogID() string {
r := rand.New(rand.NewSource(time.Now().UnixMicro()))
ip := getLocalIP()
now := time.Now()
timestamp := uint32(now.Unix())
timeNano := now.UnixNano()
pid := os.Getpid()
b := bytes.Buffer{}
b.WriteString(hex.EncodeToString(net.ParseIP(ip).To4()))
b.WriteString(fmt.Sprintf("%x", timestamp&0xffffffff))
b.WriteString(fmt.Sprintf("%04x", timeNano&0xffff))
b.WriteString(fmt.Sprintf("%04x", pid&0xffff))
b.WriteString(fmt.Sprintf("%06x", r.Int31n(1<<24)))
b.WriteString("b0")
return b.String()
}