diff --git a/src/myaktion/go.mod b/src/myaktion/go.mod
index 7269261d52472f3b788096580178fec37f8c588e..8c6a401aad320b1f2589487625f28cf0c66cfc6a 100644
--- a/src/myaktion/go.mod
+++ b/src/myaktion/go.mod
@@ -2,4 +2,9 @@ module gitlab.reutlingen-university.de/go-exercises/myaktion-go/src/myaktion
 
 go 1.20
 
-require github.com/gorilla/mux v1.8.0
+require (
+	github.com/gorilla/mux v1.8.0
+	github.com/sirupsen/logrus v1.9.0
+)
+
+require golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect
diff --git a/src/myaktion/go.sum b/src/myaktion/go.sum
index 535028803d222b0e4e9174f56529c0ed9fece4e0..656e662af702e4a5983da10a62dbb3adda6130ce 100644
--- a/src/myaktion/go.sum
+++ b/src/myaktion/go.sum
@@ -1,2 +1,17 @@
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
 github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
+github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ=
+golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/src/myaktion/handler/campaign.go b/src/myaktion/handler/campaign.go
index 216f22de96d67fc88f9251f8985266789637166e..9627a21ae8d165af7c2d84114c6a51d308c02214 100644
--- a/src/myaktion/handler/campaign.go
+++ b/src/myaktion/handler/campaign.go
@@ -2,31 +2,26 @@ package handler
 
 import (
 	"encoding/json"
-	"log"
 	"net/http"
 
+	log "github.com/sirupsen/logrus"
+
 	"gitlab.reutlingen-university.de/go-exercises/myaktion-go/src/myaktion/model"
 	"gitlab.reutlingen-university.de/go-exercises/myaktion-go/src/myaktion/service"
 )
 
 func CreateCampaign(w http.ResponseWriter, r *http.Request) {
-	var campaign model.Campaign
-	err := json.NewDecoder(r.Body).Decode(&campaign)
+	campaign, err := GetCampaign(r)
 	if err != nil {
-		log.Printf("Can't serialize request body to campaign struct: %v", err)
 		http.Error(w, err.Error(), http.StatusBadRequest)
 		return
 	}
-	if err := service.CreateCampaign(&campaign); err != nil {
+	if err = service.CreateCampaign(campaign); err != nil {
 		log.Printf("Error calling service CreateCampaign: %v", err)
 		http.Error(w, err.Error(), http.StatusInternalServerError)
 		return
 	}
-	w.Header().Set("Content-Type", "application/json")
-	if err := json.NewEncoder(w).Encode(campaign); err != nil {
-		log.Printf("Failure encoding value to JSON: %v", err)
-		http.Error(w, err.Error(), http.StatusInternalServerError)
-	}
+	sendJson(w, campaign)
 }
 
 func GetCampaigns(w http.ResponseWriter, _ *http.Request) {
@@ -36,9 +31,15 @@ func GetCampaigns(w http.ResponseWriter, _ *http.Request) {
 		http.Error(w, err.Error(), http.StatusInternalServerError)
 		return
 	}
-	w.Header().Set("Content-Type", "application/json")
-	if err := json.NewEncoder(w).Encode(campaigns); err != nil {
-		log.Printf("Failure encoding value to JSON: %v", err)
-		http.Error(w, err.Error(), http.StatusInternalServerError)
+	sendJson(w, campaigns)
+}
+
+func GetCampaign(r *http.Request) (*model.Campaign, error) {
+	var campaign model.Campaign
+	err := json.NewDecoder(r.Body).Decode(&campaign)
+	if err != nil {
+		log.Errorf("Can't serialize request body to campaign struct: %v", err)
+		return nil, err
 	}
+	return &campaign, nil
 }
diff --git a/src/myaktion/handler/util.go b/src/myaktion/handler/util.go
new file mode 100644
index 0000000000000000000000000000000000000000..026e93ab3cc45a87eb8150094f3846fdd63af799
--- /dev/null
+++ b/src/myaktion/handler/util.go
@@ -0,0 +1,32 @@
+package handler
+
+import (
+	"encoding/json"
+	"net/http"
+	"strconv"
+
+	"github.com/gorilla/mux"
+	log "github.com/sirupsen/logrus"
+)
+
+type result struct {
+	Success string `json:"success"`
+}
+
+func sendJson(w http.ResponseWriter, value interface{}) {
+	w.Header().Set("Content-Type", "application/json")
+	if err := json.NewEncoder(w).Encode(value); err != nil {
+		log.Errorf("Failure encoding value to JSON: %v", err)
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+	}
+}
+
+func getId(r *http.Request) (uint, error) {
+	vars := mux.Vars(r)
+	id, err := strconv.ParseUint(vars["id"], 10, 0)
+	if err != nil {
+		log.Errorf("Can't get ID from request: %v", err)
+		return 0, err
+	}
+	return uint(id), nil
+}
diff --git a/src/myaktion/main.go b/src/myaktion/main.go
index f4843af52b36e1d286988f7cb4db1d63a7663bdb..6b34f1d7feb72d1ea1e0c593cd7db55d5482ce65 100644
--- a/src/myaktion/main.go
+++ b/src/myaktion/main.go
@@ -2,13 +2,29 @@ package main
 
 import (
 	"fmt"
-	"log"
+	"os"
+
+	log "github.com/sirupsen/logrus"
+
 	"net/http"
 
 	"github.com/gorilla/mux"
 	"gitlab.reutlingen-university.de/go-exercises/myaktion-go/src/myaktion/handler"
 )
 
+func init() {
+	// init logger
+	log.SetFormatter(&log.TextFormatter{})
+	log.SetReportCaller(true)
+	level, err := log.ParseLevel(os.Getenv("LOG_LEVEL"))
+	if err != nil {
+		log.Info("Log level not specified, set default to: INFO")
+		log.SetLevel(log.InfoLevel)
+		return
+	}
+	log.SetLevel(level)
+}
+
 func main() {
 	fmt.Println("Starting MyAktion API server")
 	router := mux.NewRouter()