diff --git a/log/logger.go b/log/logger.go new file mode 100644 index 0000000000000000000000000000000000000000..ab258d8b731c5b8692ee8afe37b9c18012b712b2 --- /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 0000000000000000000000000000000000000000..64a259cb408139a4a1089b5a0f6714244035bf9e --- /dev/null +++ b/log/loglevel.go @@ -0,0 +1,12 @@ +package log + +type Level uint8 + +const ( + PANIC Level = iota + FATAL + ERROR + WARNING + INFO + DEBUG +)