diff --git a/src/internal/log/log.go b/src/internal/log/log.go index e34f6d9..18808c7 100644 --- a/src/internal/log/log.go +++ b/src/internal/log/log.go @@ -9,6 +9,7 @@ import ( "time" "github.com/sunbk201/ua3f/internal/config" + "golang.org/x/sys/unix" "gopkg.in/natefinch/lumberjack.v2" ) @@ -58,7 +59,7 @@ func SetLogConf(level string) { func LogHeader(version string, cfg *config.Config) { slog.Info("UA3F started", "version", version, "", cfg) - slog.Info("System Info", slog.String("Go Version", strings.TrimPrefix(strings.TrimSpace(runtime.Version()), "go")), slog.String("OS/Arch", runtime.GOOS+"/"+runtime.GOARCH)) + slog.Info("OS Info", GetOSInfo()...) } func LogDebugWithAddr(src string, dest string, msg string) { @@ -99,6 +100,51 @@ func LoadLocalLocation() *time.Location { return time.UTC } +func GetOSInfo() (attrs []any) { + + attrs = append(attrs, + slog.String("GOOS", runtime.GOOS), + slog.String("GOARCH", runtime.GOARCH), + slog.String("Go Version", runtime.Version()), + ) + + if hostname, err := os.Hostname(); err == nil { + attrs = append(attrs, slog.String("hostname", hostname)) + } + + switch runtime.GOOS { + case "linux", "darwin", "freebsd", "openbsd", "netbsd": + var uname unix.Utsname + if err := unix.Uname(&uname); err == nil { + toStr := func(b []byte) string { + n := 0 + for ; n < len(b); n++ { + if b[n] == 0 { + break + } + } + return strings.TrimSpace(string(b[:n])) + } + attrs = append(attrs, + slog.String("sysname", toStr(uname.Sysname[:])), + slog.String("nodename", toStr(uname.Nodename[:])), + slog.String("release", toStr(uname.Release[:])), + slog.String("version", toStr(uname.Version[:])), + slog.String("machine", toStr(uname.Machine[:])), + ) + } + case "windows": + osver := "unknown" + if v, ok := os.LookupEnv("OS"); ok { + osver = v + } + attrs = append(attrs, slog.String("os_version", osver)) + default: + attrs = append(attrs, slog.String("info", "unknown OS details")) + } + return attrs +} + func trim(s string) string { for len(s) > 0 && (s[len(s)-1] == '\n' || s[len(s)-1] == '\r' || s[len(s)-1] == ' ') { s = s[:len(s)-1]