From b1be2bf4aea5a3ba5dc55f887027460fcd247174 Mon Sep 17 00:00:00 2001 From: Manuel Kieweg <mail@manuelkieweg.de> Date: Mon, 28 Sep 2020 16:19:17 +0100 Subject: [PATCH] logging package --- log/logger.go | 98 +++++++++++++++++++++++++++++++++++++++++++++++++ log/loglevel.go | 12 ++++++ 2 files changed, 110 insertions(+) create mode 100644 log/logger.go create mode 100644 log/loglevel.go diff --git a/log/logger.go b/log/logger.go new file mode 100644 index 000000000..ab258d8b7 --- /dev/null +++ b/log/logger.go @@ -0,0 +1,98 @@ +package log + +import ( + "fmt" + "io" + "os" + "sync" + "time" +) + +var logger *Logger +var once sync.Once + +// Logger is a wrapper for log.Logger and provides +// methods to enable and disable logging. +type Logger struct { + Out io.Writer + Loglevel Level + lock sync.Mutex +} + +func get() *Logger { + once.Do(func() { + logger = &Logger{ + Out: os.Stdout, + Loglevel: INFO, + lock: sync.Mutex{}, + } + }) + return logger +} + +func Loglevel(level Level) { + l := get() + l.lock.Lock() + defer l.lock.Unlock() + l.Loglevel = level +} + +func Output(out io.Writer) { + l := get() + l.lock.Lock() + defer l.lock.Unlock() + l.Out = out +} + +func Debug(args ...interface{}) { + log(DEBUG, args) +} + +func Info(args ...interface{}) { + log(INFO, args) +} + +func Warn(args ...interface{}) { + log(WARNING, args) +} + +func Error(args ...interface{}) { + log(ERROR, args) +} + +func Fatal(args ...interface{}) { + log(FATAL, args) +} + +func Panic(args ...interface{}) { + log(PANIC, args) +} + +func log(level Level, args ...interface{}) { + l := get() + l.lock.Lock() + defer l.lock.Unlock() + if level <= l.Loglevel { + msg := fmt.Sprint(args...) + logMessage := time.Now().Format(time.RFC3339) + "\t" + prefix(level) + "\t" + msg + "\n" + l.Out.Write([]byte(logMessage)) + } +} + +func prefix(level Level) string { + switch level { + case PANIC: + return "PANIC" + case FATAL: + return "FATAL" + case ERROR: + return "ERROR" + case WARNING: + return "WARNING" + case INFO: + return "INFO" + case DEBUG: + return "DEBUG" + } + return "" +} diff --git a/log/loglevel.go b/log/loglevel.go new file mode 100644 index 000000000..64a259cb4 --- /dev/null +++ b/log/loglevel.go @@ -0,0 +1,12 @@ +package log + +type Level uint8 + +const ( + PANIC Level = iota + FATAL + ERROR + WARNING + INFO + DEBUG +) -- GitLab