aboutsummaryrefslogtreecommitdiff
path: root/internal/logger
diff options
context:
space:
mode:
authorRasmus Dahlberg <rasmus@rgdd.se>2023-12-31 09:39:25 +0100
committerRasmus Dahlberg <rasmus@rgdd.se>2024-01-07 20:22:23 +0100
commite18d36ebae30536c77c61cd5da123991e0ca1629 (patch)
treebf4880c0019a6009ab1b671e23ef4a1a4a5e8e08 /internal/logger
parent54d980afcbd6f0011d6a162e0003587d26a3e311 (diff)
Add drafty prototype
Diffstat (limited to 'internal/logger')
-rw-r--r--internal/logger/logger.go96
1 files changed, 96 insertions, 0 deletions
diff --git a/internal/logger/logger.go b/internal/logger/logger.go
new file mode 100644
index 0000000..195ad3e
--- /dev/null
+++ b/internal/logger/logger.go
@@ -0,0 +1,96 @@
+package logger
+
+import (
+ "fmt"
+ "log"
+ "os"
+ "sync"
+)
+
+const (
+ LevelDebug Level = iota + 1
+ LevelInfo
+ LevelNotice
+ LevelFatal
+)
+
+type Level int
+
+func NewLevel(str string) (Level, error) {
+ switch str {
+ case LevelDebug.String():
+ return LevelDebug, nil
+ case LevelInfo.String():
+ return LevelInfo, nil
+ case LevelNotice.String():
+ return LevelNotice, nil
+ case LevelFatal.String():
+ return LevelFatal, nil
+ }
+ return Level(0), fmt.Errorf("unknown level %q", str)
+}
+
+func (lv Level) String() string {
+ switch lv {
+ case LevelDebug:
+ return "DEBUG"
+ case LevelInfo:
+ return "INFO"
+ case LevelNotice:
+ return "NOTICE"
+ case LevelFatal:
+ return "FATAL"
+ default:
+ return "UNKNOWN"
+ }
+}
+
+type Config struct {
+ Level Level
+ File *os.File
+}
+
+type Logger struct {
+ cfg Config
+ log log.Logger
+ mutex sync.Mutex
+}
+
+func New(cfg Config) (l Logger) {
+ l.Reconfigure(cfg)
+ return
+}
+
+func (l *Logger) Reconfigure(cfg Config) {
+ l.mutex.Lock()
+ defer l.mutex.Unlock()
+
+ if cfg.Level < LevelDebug || cfg.Level > LevelFatal {
+ cfg.Level = LevelNotice
+ }
+ if cfg.File == nil {
+ cfg.File = os.Stdout
+ }
+
+ l.cfg = cfg
+ l.log = *log.New(l.cfg.File, "", log.Ldate|log.Ltime)
+}
+
+func (l *Logger) IsConfigured() bool {
+ return l.cfg.File != nil
+}
+
+func (l *Logger) Debugf(format string, args ...interface{}) { l.printf(LevelDebug, format, args...) }
+func (l *Logger) Infof(format string, args ...interface{}) { l.printf(LevelInfo, format, args...) }
+func (l *Logger) Noticef(format string, args ...interface{}) { l.printf(LevelNotice, format, args...) }
+func (l *Logger) Fatalf(format string, args ...interface{}) { l.printf(LevelFatal, format, args...) }
+func (l *Logger) Dief(format string, args ...interface{}) { l.Fatalf(format, args...); os.Exit(1) }
+
+func (l *Logger) printf(lv Level, format string, args ...interface{}) {
+ l.mutex.Lock()
+ defer l.mutex.Unlock()
+
+ if l.cfg.Level <= lv {
+ l.log.Printf("["+lv.String()+"] "+format, args...)
+ }
+}