From 0a477fd288d064d265395c88dbd0f261b723804e Mon Sep 17 00:00:00 2001 From: spiperac Date: Mon, 15 Jun 2026 06:42:13 +0200 Subject: Initial release --- internal/logger/logger.go | 49 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 internal/logger/logger.go (limited to 'internal/logger') 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) +} -- cgit v1.2.3