Skip to content
Snippets Groups Projects
Commit b1be2bf4 authored by Manuel Kieweg's avatar Manuel Kieweg
Browse files

logging package

parent 0f544811
Branches
Tags
2 merge requests!22Resolve "Logging: Which way we go?",!18Develop
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 ""
}
package log
type Level uint8
const (
PANIC Level = iota
FATAL
ERROR
WARNING
INFO
DEBUG
)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment