Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions pkg/logger/logger.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,29 @@ func init() {
once.Do(func() {
logger = &Logger{}
})

// Support PICOCLAW_LOG_LEVEL environment variable
if levelStr := os.Getenv("PICOCLAW_LOG_LEVEL"); levelStr != "" {
if level, ok := parseLevel(levelStr); ok {
SetLevel(level)
}
}
}

func parseLevel(s string) (LogLevel, bool) {
switch strings.ToUpper(s) {
case "DEBUG":
return DEBUG, true
case "INFO":
return INFO, true
case "WARN", "WARNING":
return WARN, true
case "ERROR":
return ERROR, true
case "FATAL":
return FATAL, true
}
return INFO, false
}

func SetLevel(level LogLevel) {
Expand Down
49 changes: 49 additions & 0 deletions pkg/logger/logger_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -137,3 +137,52 @@ func TestLoggerHelperFunctions(t *testing.T) {
DebugC("test", "Debug with component")
WarnF("Warning with fields", map[string]any{"key": "value"})
}

func TestParseLevel(t *testing.T) {
tests := []struct {
name string
input string
wantLevel LogLevel
wantOk bool
}{
// Valid cases - uppercase
{"DEBUG uppercase", "DEBUG", DEBUG, true},
{"INFO uppercase", "INFO", INFO, true},
{"WARN uppercase", "WARN", WARN, true},
{"WARNING uppercase", "WARNING", WARN, true},
{"ERROR uppercase", "ERROR", ERROR, true},
{"FATAL uppercase", "FATAL", FATAL, true},

// Valid cases - lowercase
{"DEBUG lowercase", "debug", DEBUG, true},
{"INFO lowercase", "info", INFO, true},
{"WARN lowercase", "warn", WARN, true},
{"WARNING lowercase", "warning", WARN, true},
{"ERROR lowercase", "error", ERROR, true},
{"FATAL lowercase", "fatal", FATAL, true},

// Valid cases - mixed case
{"Debug mixed case", "Debug", DEBUG, true},
{"Info mixed case", "InFo", INFO, true},
{"Warn mixed case", "WaRn", WARN, true},
{"Error mixed case", "ErRoR", ERROR, true},

// Invalid cases
{"empty string", "", INFO, false},
{"unknown value", "TRACE", INFO, false},
{"unknown value 2", "VERBOSE", INFO, false},
{"invalid value", "invalid", INFO, false},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
level, ok := parseLevel(tt.input)
if ok != tt.wantOk {
t.Errorf("parseLevel(%q) ok = %v, want %v", tt.input, ok, tt.wantOk)
}
if level != tt.wantLevel {
t.Errorf("parseLevel(%q) level = %v, want %v", tt.input, level, tt.wantLevel)
}
})
}
}
Loading