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
+)