aboutsummaryrefslogtreecommitdiff
path: root/logger.go
blob: 1fcbfeb2bbc8ba3fd4a0b33d5a78454e0b6a5335 (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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package main

import (
	"fmt"
	"log"
)

type LevelEnum uint8

const (
	None LevelEnum = iota
	Error
	Warn
	Info
	Debug
)

type levelInfo struct {
	abbrev string
	color  string
}

var (
	levelInfos = map[LevelEnum]levelInfo{
		Error: {"ERR", ansiRed},
		Warn:  {"WARN", ansiYellow},
		Info:  {"INFO", ansiCyan},
		Debug: {"DEBUG", ansiGreen},
	}
)

func (s LevelEnum) Info() levelInfo {
	info, ok := levelInfos[s]
	if !ok {
		return levelInfo{"UNK", ansiWhite}
	}
	return info
}

func (s LevelEnum) Format() string {
	info := s.Info()
	return colorize("["+info.abbrev+"]", info.color)
}

type Logger struct {
	Level LevelEnum

	ns string
}

func NewLogger(level LevelEnum) *Logger {
	return &Logger{
		Level: level,
	}
}

func (l *Logger) WithNS(ns string) *Logger {
	return &Logger{
		Level: l.Level,
		ns:    formatNS(ns),
	}
}

func (l *Logger) Logf(level LevelEnum, format string, args ...any) {
	if level > l.Level {
		return
	}
	log.Printf("%s%s %s", l.ns, level.Format(), fmt.Sprintf(format, args...))
}

func (l *Logger) Errorf(format string, args ...any) { l.Logf(Error, format, args...) }
func (l *Logger) Warnf(format string, args ...any)  { l.Logf(Warn, format, args...) }
func (l *Logger) Infof(format string, args ...any)  { l.Logf(Info, format, args...) }
func (l *Logger) Debugf(format string, args ...any) { l.Logf(Debug, format, args...) }

func formatNS(ns string) string {
	return colorize("["+ns+"]", ansiPurple)
}

var ansiReset = "\033[0m"
var ansiRed = "\033[31m"
var ansiGreen = "\033[32m"
var ansiYellow = "\033[33m"
var ansiBlue = "\033[34m"
var ansiPurple = "\033[35m"
var ansiCyan = "\033[36m"
var ansiGray = "\033[37m"
var ansiWhite = "\033[97m"

func colorize(s string, color string) string {
	return color + s + ansiReset
}