diff options
Diffstat (limited to 'internal/logger/logger.go')
| -rw-r--r-- | internal/logger/logger.go | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/internal/logger/logger.go b/internal/logger/logger.go new file mode 100644 index 0000000..e0f6598 --- /dev/null +++ b/internal/logger/logger.go @@ -0,0 +1,49 @@ +// Package logger provides a minimal levelled logger for Shiv. +// Output is gated behind a verbose flag set at startup via Init. +// Only fatal startup messages use Always — everything else is verbose. +package logger + +import ( + "fmt" + "io" + "os" + "time" +) + +var verbose bool + +// Init configures the logger. Call once at startup. +func Init(isVerbose bool) { + verbose = isVerbose +} + +// Always logs a message that is always shown regardless of verbose flag. +// Use sparingly — only for critical startup/shutdown messages. +func Always(format string, args ...any) { + log(os.Stdout, "INFO", format, args...) +} + +// Info logs a message only when verbose mode is enabled. +func Info(format string, args ...any) { + if verbose { + log(os.Stdout, "INFO", format, args...) + } +} + +// Error logs an error that is always shown. +func Error(format string, args ...any) { + log(os.Stderr, "ERR ", format, args...) +} + +// Debug logs a message only when verbose mode is enabled. +func Debug(format string, args ...any) { + if verbose { + log(os.Stdout, "DBG ", format, args...) + } +} + +func log(w io.Writer, level, format string, args ...any) { + timestamp := time.Now().Format("15:04:05.000") + msg := fmt.Sprintf(format, args...) + fmt.Fprintf(w, "[shiv] %s %s %s\n", timestamp, level, msg) +} |
