summaryrefslogtreecommitdiff
path: root/internal/logger
diff options
context:
space:
mode:
authorspiperac <[email protected]>2026-06-15 06:42:13 +0200
committerspiperac <[email protected]>2026-06-15 06:42:13 +0200
commit0a477fd288d064d265395c88dbd0f261b723804e (patch)
tree9b129f8f41c907285b89ed8385679934bb59c14f /internal/logger
Initial release
Diffstat (limited to 'internal/logger')
-rw-r--r--internal/logger/logger.go49
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)
+}