summaryrefslogtreecommitdiff
path: root/internal/logger/logger.go
blob: e0f6598de26b285d94fdabb497d57de51cca8f3a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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)
}