diff --git a/cmd/gosdn/main.go b/cmd/gosdn/main.go
index 0f3e798ba397c7bfdfe4c53283e3cc95b8d5358e..7555cd65a66a644d0bdafef8e15a01257b239814 100644
--- a/cmd/gosdn/main.go
+++ b/cmd/gosdn/main.go
@@ -1,9 +1,9 @@
 package main
 
 import (
-	"code.fbi.h-da.de/cocsn/gosdn/log"
 	"code.fbi.h-da.de/cocsn/gosdn/nucleus"
 	"flag"
+	log "github.com/sirupsen/logrus"
 )
 
 func main() {
@@ -16,7 +16,7 @@ func main() {
 	flag.Parse()
 	cliSocket := *cliListenAddr + ":" + *cliListenPort
 
-	log.Loglevel(log.DEBUG)
+	log.SetLevel(log.DebugLevel)
 
 	// Setup a channel to communicate if goSDN should shutdown.
 	IsRunningChannel := make(chan bool)
diff --git a/database/client.go b/database/client.go
index 69efde8c303e1092eda2b8390fa70e6599d84c35..ace3ae0133d477316996c47d64812cde4c41bc4e 100644
--- a/database/client.go
+++ b/database/client.go
@@ -1,7 +1,7 @@
 package database
 
 import (
-	"code.fbi.h-da.de/cocsn/gosdn/log"
+	log "github.com/sirupsen/logrus"
 	"errors"
 	"github.com/neo4j/neo4j-go-driver/neo4j"
 )
diff --git a/go.mod b/go.mod
index 7411edc9a0644737f93b37777e32816755f822e0..6931f95e021929526f4576020753dd1b053ed534 100644
--- a/go.mod
+++ b/go.mod
@@ -13,6 +13,7 @@ require (
 	github.com/neo4j/neo4j-go-driver v1.8.3
 	github.com/onsi/ginkgo v1.13.0 // indirect
 	github.com/rivo/tview v0.0.0-20201018122409-d551c850a743
+	github.com/sirupsen/logrus v1.4.2
 	golang.org/x/net v0.0.0-20200904194848-62affa334b73 // indirect
 	google.golang.org/genproto v0.0.0-20200519141106-08726f379972 // indirect
 	google.golang.org/grpc v1.29.1
diff --git a/go.sum b/go.sum
index 86322fe5c669de0df7af85a81f4ccdbf4f888403..068b336d320d5cb2c04c2980060b37ad15813906 100644
--- a/go.sum
+++ b/go.sum
@@ -228,6 +228,7 @@ github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZ
 github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
 github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
+github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
 github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
 github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
diff --git a/log/logger.go b/log/logger.go
deleted file mode 100644
index 9694aabe4ac0175bffc2cc424bf8b9cc782f4545..0000000000000000000000000000000000000000
--- a/log/logger.go
+++ /dev/null
@@ -1,212 +0,0 @@
-package log
-
-import (
-	"fmt"
-	"io"
-	"log/syslog"
-	"os"
-	"reflect"
-	"runtime"
-	"strconv"
-	"strings"
-	"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 {
-	DefaultWriter  io.Writer
-	LoglevelWriter map[Level]io.Writer
-	toSyslog       map[Level]bool
-	Loglevel       Level
-	lock           sync.Mutex
-	builder        strings.Builder
-}
-
-func (l *Logger) buildMessage(level Level, syslog bool, args ...interface{}) {
-	if !syslog {
-		l.builder.WriteString(time.Now().Format(time.RFC3339))
-	}
-	l.builder.WriteRune('\t')
-	l.builder.WriteString(prefix(level))
-	l.builder.WriteRune('\t')
-	function, line := callers()
-	functionSplitted := strings.SplitAfter(function, "/")
-	function = functionSplitted[len(functionSplitted)-1]
-	l.builder.WriteString(function)
-	l.builder.WriteRune(':')
-	l.builder.WriteString(strconv.Itoa(line))
-	l.builder.WriteRune('\t')
-	l.builder.WriteString(fmt.Sprint(args...))
-	l.builder.WriteRune('\n')
-}
-
-func get() *Logger {
-	once.Do(func() {
-		logger = &Logger{
-			DefaultWriter:  os.Stderr,
-			LoglevelWriter: make(map[Level]io.Writer),
-			toSyslog:       make(map[Level]bool),
-			Loglevel:       INFO,
-			lock:           sync.Mutex{},
-		}
-	})
-	return logger
-}
-
-// Loglevel sets the verbosity of the logger
-// Defaults to INFO
-func Loglevel(level Level) {
-	l := get()
-	l.lock.Lock()
-	defer l.lock.Unlock()
-	l.Loglevel = level
-}
-
-// Output defines the output of the logger
-// Defaults to os.Stderr
-func Output(out io.Writer) {
-	l := get()
-	l.lock.Lock()
-	defer l.lock.Unlock()
-	l.DefaultWriter = out
-}
-
-// LoglevelOutput defines a special output
-// for a certain log level
-func LoglevelOutput(level Level, out io.Writer) {
-	l := get()
-	l.lock.Lock()
-	defer l.lock.Unlock()
-	l.LoglevelWriter[level] = out
-	if reflect.TypeOf(out) == reflect.TypeOf(&syslog.Writer{}) {
-		l.toSyslog[level] = true
-	}
-}
-
-// Debug passes the DEBUG flag and a
-// message to the logger
-func Debug(args ...interface{}) {
-	log(DEBUG, args...)
-}
-
-// Info passes the INFO flag and a
-// message to the logger
-func Info(args ...interface{}) {
-	log(INFO, args...)
-}
-
-// Warn passes the WARNING flag and a
-// message to the logger
-func Warn(args ...interface{}) {
-	log(WARNING, args...)
-}
-
-// Error passes the ERROR flag and a
-// message to the logger
-func Error(args ...interface{}) {
-	log(ERROR, args...)
-}
-
-// Fatal passes the FATAL flag and a
-// message to the logger and calls
-// os.Exit(1)
-func Fatal(args ...interface{}) {
-	log(FATAL, args...)
-	os.Exit(1)
-}
-
-// Debugf passes the DEBUG flag,
-// a formatted string and a
-// message to the logger
-func Debugf(format string, args ...interface{}) {
-	logf(DEBUG, format, args...)
-}
-
-// Infof passes the INFO flag,
-// a formatted string and and a
-// message to the logger
-func Infof(format string, args ...interface{}) {
-	logf(INFO, format, args...)
-}
-
-// Warnf passes the WARNING flag,
-// a formatted string and and a
-// message to the logger
-func Warnf(format string, args ...interface{}) {
-	logf(WARNING, format, args...)
-}
-
-// Errorf passes the ERROR flag,
-// a formatted string and and a
-// message to the logger
-func Errorf(format string, args ...interface{}) {
-	logf(ERROR, format, args...)
-}
-
-// Fatalf passes the FATAL flag,
-// a formatted string and and a
-// message to the logger and calls
-// os.Exit(1)
-func Fatalf(format string, args ...interface{}) {
-	logf(FATAL, format, args...)
-	os.Exit(1)
-}
-
-func logf(level Level, format string, args ...interface{}) {
-	log(level, fmt.Sprintf(format, args...))
-}
-
-func log(level Level, args ...interface{}) {
-	defer func() {
-		if r := recover(); r != nil {
-			fmt.Println("Recovered in f", r)
-		}
-	}()
-	l := get()
-	l.lock.Lock()
-	defer l.lock.Unlock()
-	defer l.builder.Reset()
-	if level <= l.Loglevel {
-		l.buildMessage(level, l.toSyslog[level], args...)
-		msg := []byte(l.builder.String())
-		writer, ok := l.LoglevelWriter[level]
-		var err error
-		if !ok {
-			_, err = l.DefaultWriter.Write(msg)
-		} else {
-			_, err = writer.Write(msg)
-		}
-		if err != nil {
-			panic(err)
-		}
-	}
-}
-
-func callers() (string, int) {
-	pc := make([]uintptr, 15)
-	n := runtime.Callers(5, pc)
-	frames := runtime.CallersFrames(pc[:n])
-	frame, _ := frames.Next()
-	return frame.Function, frame.Line
-}
-
-func prefix(level Level) string {
-	switch level {
-	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
deleted file mode 100644
index 377e454b6c5e23b7f27fa970a28f456cd05bd33c..0000000000000000000000000000000000000000
--- a/log/loglevel.go
+++ /dev/null
@@ -1,15 +0,0 @@
-package log
-
-// Level is an 8 bit integer representing a
-// log level for the logger
-type Level uint8
-
-// Constants for more verbose integer
-// values
-const (
-	FATAL Level = iota
-	ERROR
-	WARNING
-	INFO
-	DEBUG
-)
diff --git a/nucleus/cli-handling.go b/nucleus/cli-handling.go
index b95e9094300432d7db949dcaac9e84da5a01100e..81c11d1a8e03c68d9071f2b2df2d202397002403 100644
--- a/nucleus/cli-handling.go
+++ b/nucleus/cli-handling.go
@@ -14,8 +14,8 @@ import (
 	"sync"
 
 	pb "code.fbi.h-da.de/cocsn/gosdn/api/proto"
-	"code.fbi.h-da.de/cocsn/gosdn/log"
 	"code.fbi.h-da.de/cocsn/gosdn/sbi/restconf/client/ciena"
+	log "github.com/sirupsen/logrus"
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/health"
 	healthpb "google.golang.org/grpc/health/grpc_health_v1"
@@ -120,7 +120,7 @@ func getCLIGoing(core *Core) {
 
 	//TODO: move?
 	wrt := io.MultiWriter(os.Stdout, &logBuffer)
-	log.Output(wrt)
+	log.SetOutput(wrt)
 
 	healthpb.RegisterHealthServer(cliControlServer, healthCheck)
 	pb.RegisterGrpcCliServer(cliControlServer, srv)
diff --git a/nucleus/controller.go b/nucleus/controller.go
index 5072dfbbdff572f9026e62a04a8e005c219cc3a0..c403f40a6300067eb0b183a3fa9caa44464fb023 100644
--- a/nucleus/controller.go
+++ b/nucleus/controller.go
@@ -2,7 +2,7 @@ package nucleus
 
 import (
 	"code.fbi.h-da.de/cocsn/gosdn/database"
-	"code.fbi.h-da.de/cocsn/gosdn/log"
+	log "github.com/sirupsen/logrus"
 	"code.fbi.h-da.de/cocsn/gosdn/nucleus/interfaces"
 	"code.fbi.h-da.de/cocsn/gosdn/sbi/restconf/client/ciena"
 	"github.com/BurntSushi/toml"
diff --git a/nucleus/nucleus-core.go b/nucleus/nucleus-core.go
index 0276a4ad80b52fc325373b7c8e551512e2c098f7..f6e9b66c36549c4f66e0324457a563b385991c27 100644
--- a/nucleus/nucleus-core.go
+++ b/nucleus/nucleus-core.go
@@ -2,7 +2,7 @@ package nucleus
 
 import (
 	"code.fbi.h-da.de/cocsn/gosdn/database"
-	"code.fbi.h-da.de/cocsn/gosdn/log"
+	log "github.com/sirupsen/logrus"
 	"code.fbi.h-da.de/cocsn/gosdn/nucleus/interfaces"
 	"time"
 )
diff --git a/sbi/restconf/client/ciena/client.go b/sbi/restconf/client/ciena/client.go
index 6e9a772c9cd56960e75544578249dbb7cb23aef7..59ae6a40a4ad94fa2358ccc996011e5455f0983e 100644
--- a/sbi/restconf/client/ciena/client.go
+++ b/sbi/restconf/client/ciena/client.go
@@ -3,7 +3,7 @@ package ciena
 import (
 	"bytes"
 	"code.fbi.h-da.de/cocsn/gosdn/database"
-	"code.fbi.h-da.de/cocsn/gosdn/log"
+	log "github.com/sirupsen/logrus"
 	"code.fbi.h-da.de/cocsn/gosdn/nucleus/interfaces"
 	"code.fbi.h-da.de/cocsn/gosdn/sbi/restconf/util"
 	apiclient "code.fbi.h-da.de/cocsn/swagger/apis/mcp/client"