diff --git a/pkg/logger/logger.go b/pkg/logger/logger.go index f88d5ed2b..33079616a 100644 --- a/pkg/logger/logger.go +++ b/pkg/logger/logger.go @@ -11,6 +11,7 @@ import ( "sync" "github.com/rs/zerolog" + "golang.org/x/term" ) type LogLevel = zerolog.Level @@ -46,6 +47,8 @@ func init() { once.Do(func() { zerolog.SetGlobalLevel(zerolog.InfoLevel) + isTTY := term.IsTerminal(int(os.Stdout.Fd())) + consoleWriter := zerolog.ConsoleWriter{ Out: os.Stdout, TimeFormat: "15:04:05", // TODO: make it configurable??? @@ -61,9 +64,12 @@ func init() { }, FieldsExclude: []string{Component}, FormatPrepare: func(fields map[string]any) error { - fields[Component] = fmt.Sprintf("\x1b[33m%v\x1b[0m", fields[Component]) + if isTTY { + fields[Component] = fmt.Sprintf("\x1b[33m%v\x1b[0m", fields[Component]) + } return nil }, + NoColor: !isTTY, } logger = zerolog.New(consoleWriter).With().Timestamp().Caller().Logger() @@ -207,16 +213,25 @@ func ConfigureFromEnv() { } } +const ( + locUnknown = "" +) + func getPackageNameFromFile(filePath string) string { dir := filepath.Dir(filePath) importPath := filepath.ToSlash(dir) parts := strings.Split(importPath, "/") if len(parts) == 0 { - return "" + return locUnknown } - return parts[len(parts)-1] + pkg := parts[len(parts)-1] + if pkg == "." { + return "
" + } + + return pkg } func getCallerSkip() (int, string) { @@ -246,7 +261,7 @@ func getCallerSkip() (int, string) { return i - 1, getPackageNameFromFile(file) } - return 3, "" + return 3, locUnknown } //nolint:zerologlint diff --git a/pkg/logger/logger_test.go b/pkg/logger/logger_test.go index 1eca72607..7a7712de0 100644 --- a/pkg/logger/logger_test.go +++ b/pkg/logger/logger_test.go @@ -406,3 +406,28 @@ func TestConfigureFromEnvNoEnv(t *testing.T) { os.Unsetenv("PICOCLAW_LOG_FILE") ConfigureFromEnv() } + +func TestGetPackageNameFromFile(t *testing.T) { + tests := []struct { + name string + path string + want string + }{ + {"normal package path", "/home/user/project/pkg/logger/logger.go", "logger"}, + {"nested package", "/home/user/project/internal/service/auth/handler.go", "auth"}, + {"cmd package", "/home/user/project/cmd/server/main.go", "server"}, + {"project root returns main", "./main.go", "
"}, + {"single dot returns main", ".", "
"}, + {"single directory", "mypkg/file.go", "mypkg"}, + {"deep nesting", "/a/b/c/d/e/f.go", "e"}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := getPackageNameFromFile(tt.path) + if got != tt.want { + t.Errorf("getPackageNameFromFile(%q) = %q, want %q", tt.path, got, tt.want) + } + }) + } +}