diff --git a/go.mod b/go.mod
index 29dade4a1b62b503877e60605938b9af5c836400..422d1698b0a1d3589a051c5ff5f489bd3ea20c9c 100644
--- a/go.mod
+++ b/go.mod
@@ -5,6 +5,7 @@ go 1.23.0
 require (
 	github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0
 	github.com/stretchr/testify v1.9.0
+	go.elastic.co/ecslogrus v1.0.0
 	google.golang.org/grpc v1.64.0
 	gopkg.in/yaml.v3 v3.0.1
 )
@@ -12,13 +13,15 @@ require (
 require (
 	github.com/davecgh/go-spew v1.1.1 // indirect
 	github.com/kr/text v0.2.0 // indirect
+	github.com/magefile/mage v1.9.0 // indirect
 	github.com/pmezard/go-difflib v1.0.0 // indirect
 	github.com/rogpeppe/go-internal v1.12.0 // indirect
+	github.com/sirupsen/logrus v1.9.3 // indirect
 	golang.org/x/net v0.26.0 // indirect
 	golang.org/x/sys v0.21.0 // indirect
 	golang.org/x/text v0.16.0 // indirect
 	google.golang.org/genproto/googleapis/api v0.0.0-20240513163218-0867130af1f8 // indirect
 	google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8 // indirect
-	google.golang.org/protobuf v1.34.2 // indirect
 	google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.4.0 // indirect
+	google.golang.org/protobuf v1.34.2 // indirect
 )
diff --git a/go.sum b/go.sum
index a45d8abbc04dd9e184f0c7dc75be44c5a78bae4e..c7bb24c441208d9bd4ed4d80f3d616028ae84aa7 100644
--- a/go.sum
+++ b/go.sum
@@ -1,22 +1,41 @@
 github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+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/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0=
 github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
 github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/magefile/mage v1.9.0 h1:t3AU2wNwehMCW97vuqQLtw6puppWXHO+O2MHo5a50XE=
+github.com/magefile/mage v1.9.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 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/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
 github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
+github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM=
+github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
+github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
+github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.5.0/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
 github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+go.elastic.co/ecslogrus v1.0.0 h1:o1qvcCNaq+eyH804AuK6OOiUupLIXVDfYjDtSLPwukM=
+go.elastic.co/ecslogrus v1.0.0/go.mod h1:vMdpljurPbwu+iFmNc/HSWCkn1Fu/dYde1o/adaEczo=
 golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ=
 golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
+golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=
 golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
@@ -27,12 +46,15 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8 h1:
 google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8/go.mod h1:I7Y+G38R2bu5j1aLzfFmQfTcU/WnFuqDwLZAbvKTKpM=
 google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY=
 google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg=
+google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.4.0 h1:9SxA29VM43MF5Z9dQu694wmY5t8E/Gxr7s+RSxiIDmc=
+google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.4.0/go.mod h1:yZOK5zhQMiALmuweVdIVoQPa6eIJyXn2B9g5dJDhqX4=
 google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
 google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.4.0 h1:9SxA29VM43MF5Z9dQu694wmY5t8E/Gxr7s+RSxiIDmc=
-google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.4.0/go.mod h1:yZOK5zhQMiALmuweVdIVoQPa6eIJyXn2B9g5dJDhqX4=
diff --git a/internal/config/config.go b/internal/config/config.go
index 8a668af900963f92a2a1131a9bee4c4f138dce5d..65eb7f9b6fdcb73214557e88c6e281938293d471 100644
--- a/internal/config/config.go
+++ b/internal/config/config.go
@@ -28,7 +28,8 @@ package config
 import (
 	"fmt"
 	"gopkg.in/yaml.v3"
-	"log"
+	log "github.com/sirupsen/logrus"
+	"go.elastic.co/ecslogrus"
 	"os"
 	"testing"
 )
@@ -61,6 +62,7 @@ type Config struct {
 
 func LoadConfig(configFilePath ...string) Config {
 	var config Config
+	log.SetFormatter(&ecslogrus.Formatter{})
 
 	configFile := defaultConfig
 
diff --git a/internal/logging/logger.go b/internal/logging/logger.go
deleted file mode 100644
index f37932b73352d551789403462e99675969dd1365..0000000000000000000000000000000000000000
--- a/internal/logging/logger.go
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (C) 2023-2024
- * Das Land Schleswig-Holstein vertreten durch den
- * Ministerpräsidenten des Landes Schleswig-Holstein
- * Staatskanzlei
- * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
- *
- * Lizenziert unter der EUPL, Version 1.2 oder - sobald
- * diese von der Europäischen Kommission genehmigt wurden -
- * Folgeversionen der EUPL ("Lizenz");
- * Sie dürfen dieses Werk ausschließlich gemäß
- * dieser Lizenz nutzen.
- * Eine Kopie der Lizenz finden Sie hier:
- *
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
- *
- * Sofern nicht durch anwendbare Rechtsvorschriften
- * gefordert oder in schriftlicher Form vereinbart, wird
- * die unter der Lizenz verbreitete Software "so wie sie
- * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
- * ausdrücklich oder stillschweigend - verbreitet.
- * Die sprachspezifischen Genehmigungen und Beschränkungen
- * unter der Lizenz sind dem Lizenztext zu entnehmen.
- */
-
-package logging
-
-import (
-	"antragsraum-proxy/internal/config"
-	"fmt"
-	"log"
-	"os"
-	"sync"
-)
-
-const (
-	logLevelNumError = iota
-	logLevelNumWarning
-	logLevelNumInfo
-	logLevelNumDebug
-	LogLevelError   = "ERROR"
-	LogLevelWarning = "WARN"
-	LogLevelInfo    = "INFO"
-	LogLevelDebug   = "DEBUG"
-)
-
-type Logger struct {
-	BaseLogger *log.Logger
-	level      int
-}
-
-var (
-	logger *Logger
-	once   sync.Once
-)
-
-func GetLogger() *Logger {
-	initializeLogger()
-
-	return logger
-}
-
-func initializeLogger() {
-	once.Do(func() {
-		logger = &Logger{
-			BaseLogger: log.New(os.Stdout, "", log.LstdFlags),
-			level:      getLoggingLevel(),
-		}
-	})
-}
-
-func getLoggingLevel() int {
-	logLevelMap := map[string]int{
-		LogLevelError:   logLevelNumError,
-		LogLevelWarning: logLevelNumWarning,
-		LogLevelInfo:    logLevelNumInfo,
-		LogLevelDebug:   logLevelNumDebug,
-	}
-
-	conf := config.LoadConfig()
-	logLevel, exists := logLevelMap[conf.Logging.Level]
-	if !exists {
-		logLevel = logLevelMap[LogLevelInfo]
-	}
-
-	return logLevel
-}
-
-func (l *Logger) log(level int, prefix, format string, v ...any) {
-	if l.level >= level {
-		l.BaseLogger.Println(fmt.Sprintf("%v: %v", prefix, fmt.Sprintf(format, v...)))
-	}
-}
-
-func (l *Logger) Fatal(format string, v ...any) {
-	l.BaseLogger.Fatalln(fmt.Sprintf("FATAL: "+format, v...))
-}
-
-func (l *Logger) Error(format string, v ...any) {
-	l.log(logLevelNumError, "ERROR", format, v...)
-}
-
-func (l *Logger) Warning(format string, v ...any) {
-	l.log(logLevelNumWarning, "WARNING", format, v...)
-}
-
-func (l *Logger) Info(format string, v ...any) {
-	l.log(logLevelNumInfo, "INFO", format, v...)
-}
-
-func (l *Logger) Debug(format string, v ...any) {
-	l.log(logLevelNumDebug, "DEBUG", format, v...)
-}
diff --git a/internal/logging/logger_test.go b/internal/logging/logger_test.go
deleted file mode 100644
index f0b209ca5d6f61b82ae3e38d3ef1316c8980c1f2..0000000000000000000000000000000000000000
--- a/internal/logging/logger_test.go
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 2023-2024
- * Das Land Schleswig-Holstein vertreten durch den
- * Ministerpräsidenten des Landes Schleswig-Holstein
- * Staatskanzlei
- * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
- *
- * Lizenziert unter der EUPL, Version 1.2 oder - sobald
- * diese von der Europäischen Kommission genehmigt wurden -
- * Folgeversionen der EUPL ("Lizenz");
- * Sie dürfen dieses Werk ausschließlich gemäß
- * dieser Lizenz nutzen.
- * Eine Kopie der Lizenz finden Sie hier:
- *
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
- *
- * Sofern nicht durch anwendbare Rechtsvorschriften
- * gefordert oder in schriftlicher Form vereinbart, wird
- * die unter der Lizenz verbreitete Software "so wie sie
- * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
- * ausdrücklich oder stillschweigend - verbreitet.
- * Die sprachspezifischen Genehmigungen und Beschränkungen
- * unter der Lizenz sind dem Lizenztext zu entnehmen.
- */
-
-package logging
-
-import (
-	"bytes"
-	"github.com/stretchr/testify/assert"
-	"testing"
-)
-
-func logMessage(level string, msg string) *bytes.Buffer {
-	logger := GetLogger()
-
-	var buf bytes.Buffer
-	logger.BaseLogger.SetOutput(&buf)
-
-	originalFlags := logger.BaseLogger.Flags()
-	defer func() {
-		logger.BaseLogger.SetOutput(nil)
-		logger.BaseLogger.SetFlags(originalFlags)
-	}()
-
-	if level == LogLevelError {
-		logger.Error(msg)
-	} else if level == LogLevelWarning {
-		logger.Warning(msg)
-	} else if level == LogLevelInfo {
-		logger.Info(msg)
-	} else {
-		logger.Debug(msg)
-	}
-
-	return &buf
-}
-
-func TestError(t *testing.T) {
-	buf := logMessage(LogLevelError, "test error")
-
-	assert.Contains(t, buf.String(), "ERROR: test error")
-}
-
-func TestWarning(t *testing.T) {
-	buf := logMessage(LogLevelWarning, "test warning")
-
-	assert.Contains(t, buf.String(), "WARNING: test warning")
-}
-
-func TestInfo(t *testing.T) {
-	buf := logMessage(LogLevelInfo, "test info")
-
-	assert.Contains(t, buf.String(), "INFO: test info")
-}
-
-func TestDebug(t *testing.T) {
-	buf := logMessage(LogLevelDebug, "test debug")
-
-	assert.Empty(t, buf.String())
-}
diff --git a/internal/logging/testdata/config.yml b/internal/logging/testdata/config.yml
deleted file mode 100755
index c82f00915da1dac6dc64101fcec262d984848323..0000000000000000000000000000000000000000
--- a/internal/logging/testdata/config.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-http:
-  server:
-    port: 8082
-grpc:
-  server:
-    port: 50052
-  router:
-    port: 50051
-logging:
-  level: "INFO"
\ No newline at end of file
diff --git a/internal/mock/globals.go b/internal/mock/globals.go
index e3ed159d43c9daf900849cbaaec3415e10907cfa..83da2eaa8ca203bb140f6515df542ac60ba583f6 100644
--- a/internal/mock/globals.go
+++ b/internal/mock/globals.go
@@ -2,8 +2,6 @@ package mock
 
 import (
 	"antragsraum-proxy/internal/config"
-	"antragsraum-proxy/internal/logging"
 )
 
 var conf = config.LoadConfig()
-var logger = logging.GetLogger()
diff --git a/internal/mock/grpc_server.go b/internal/mock/grpc_server.go
index 5dcb18f9b9e8237ac3274086ab8244c24b027bac..c47e3c42084e61c7717cd73683e274bb56a2de50 100644
--- a/internal/mock/grpc_server.go
+++ b/internal/mock/grpc_server.go
@@ -26,6 +26,7 @@
 package mock
 
 import (
+    log "github.com/sirupsen/logrus"
 	pb "antragsraum-proxy/gen/go"
 	"context"
 	"fmt"
@@ -151,12 +152,12 @@ func StartGrpcServer() *grpc.Server {
 
 	lis, err := net.Listen("tcp", fmt.Sprintf(":%d", conf.Grpc.Server.Port))
 	if err != nil {
-		logger.Fatal("gRPC server failed to listen: %v", err)
+		log.Fatal(fmt.Sprintf("gRPC server failed to listen: %v", err))
 	}
 
-	logger.Info("gRPC server listening on port %v", conf.Grpc.Server.Port)
+	log.Info(fmt.Sprintf("gRPC server listening on port %v", conf.Grpc.Server.Port))
 	if err := s.Serve(lis); err != nil {
-		logger.Fatal("gRPC server failed to serve: %v", err)
+		log.Fatal(fmt.Sprintf("gRPC server failed to serve: %v", err))
 	}
 
 	return s
diff --git a/internal/server/globals.go b/internal/server/globals.go
index 4e832f3ef72522d0c28d434dd1724fdc93c8b0ca..315c9cbaf3fe0602cf8704875f97b528b3042ad8 100644
--- a/internal/server/globals.go
+++ b/internal/server/globals.go
@@ -2,7 +2,6 @@ package server
 
 import (
 	"antragsraum-proxy/internal/config"
-	"antragsraum-proxy/internal/logging"
 )
 
 const (
@@ -11,4 +10,3 @@ const (
 )
 
 var conf = config.LoadConfig()
-var logger = logging.GetLogger()
diff --git a/internal/server/grpc_router.go b/internal/server/grpc_router.go
index 3a1cb4007616e3223a41e1c623cd365b4e861907..5df67e5614d5a811d73e0f0d6f46bc98cb74dbfd 100644
--- a/internal/server/grpc_router.go
+++ b/internal/server/grpc_router.go
@@ -31,6 +31,7 @@ import (
 	"google.golang.org/grpc/credentials/insecure"
 	"google.golang.org/grpc/metadata"
 	"google.golang.org/grpc/status"
+	log "github.com/sirupsen/logrus"
 	"net"
 )
 
@@ -94,7 +95,7 @@ func createRueckfrageClient(grpcAddress string) (pb.AntragraumServiceClient, fun
 	target := GetGrpcServerUrl(grpcAddress, conf)
 	conn, err := grpc.NewClient(target, grpc.WithTransportCredentials(insecure.NewCredentials()))
 	if err != nil {
-		logger.Error("rueckfrage router failed to route: %v", err)
+		log.WithError(err).Error("rueckfrage router failed to route: %v", err)
 
 		return nil, nil, errors.New("rueckfrage router failed to route")
 	}
@@ -126,7 +127,7 @@ func createCommandClient(grpcAddress string) (pb.CommandServiceClient, func() er
 	target := GetGrpcServerUrl(grpcAddress, conf)
 	conn, err := grpc.NewClient(target, grpc.WithTransportCredentials(insecure.NewCredentials()))
 	if err != nil {
-		logger.Error("command router failed to route: %v", err)
+		log.Error(fmt.Sprintf("command router failed to route: %v", err))
 
 		return nil, nil, errors.New("command router failed to route")
 	}
@@ -169,12 +170,12 @@ func StartGrpcRouter() *grpc.Server {
 
 	lis, err := net.Listen("tcp", fmt.Sprintf(":%d", conf.Grpc.Router.Port))
 	if err != nil {
-		logger.Fatal("gRPC router failed to listen: %v", err)
+		log.Fatal(fmt.Sprintf("gRPC router failed to listen: %v", err))
 	}
-	logger.Info("gRPC router listening on port %d", conf.Grpc.Router.Port)
+	log.Info(fmt.Sprintf("gRPC router listening on port %d", conf.Grpc.Router.Port))
 
 	if err = s.Serve(lis); err != nil {
-		logger.Fatal("gRPC router failed to serve: %v", err)
+		log.Fatal(fmt.Sprintf("gRPC router failed to serve: %v", err))
 	}
 
 	return s
diff --git a/internal/server/handler.go b/internal/server/handler.go
index dcceaf6bb95cd47ec2abfa43f57c8c1d5704d2dd..cfce1a9d0b8f0ab5d24abf4e26ccb7d60c64301d 100644
--- a/internal/server/handler.go
+++ b/internal/server/handler.go
@@ -26,6 +26,7 @@
 package server
 
 import (
+    log "github.com/sirupsen/logrus"
 	pb "antragsraum-proxy/gen/go"
 	"bytes"
 	"context"
@@ -53,14 +54,14 @@ func RegisterHomeEndpoint(mux *runtime.ServeMux) {
 	err := mux.HandlePath("GET", "/", func(w http.ResponseWriter, r *http.Request, pathParams map[string]string) {
 		defer func() {
 			if err := recover(); err != nil {
-				logger.Error("failed to recover: %v", err)
+				log.Error(fmt.Sprintf("failed to recover: %v", err))
 				http.Error(w, fmt.Sprintf("failed to recover: %v", err), http.StatusInternalServerError)
 			}
 		}()
 	})
 
 	if err != nil {
-		logger.Fatal("failed to register home endpoint: %v", err)
+		log.Fatal(fmt.Sprintf("failed to register home endpoint: %v", err))
 	}
 }
 
@@ -68,7 +69,7 @@ func RegisterAntragraumEndpoints(ctx context.Context, mux *runtime.ServeMux, grp
 	opts := []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())}
 	err := pb.RegisterAntragraumServiceHandlerFromEndpoint(ctx, mux, grpcUrl, opts)
 	if err != nil {
-		logger.Fatal("failed to register antragraum endpoints: %v", err)
+		log.Fatal(fmt.Sprintf("failed to register antragraum endpoints: %v", err))
 	}
 }
 
@@ -76,7 +77,7 @@ func RegisterCommandEndpoints(ctx context.Context, mux *runtime.ServeMux, grpcUr
 	opts := []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())}
 	err := pb.RegisterCommandServiceHandlerFromEndpoint(ctx, mux, grpcUrl, opts)
 	if err != nil {
-		logger.Fatal("failed to register command endpoints: %v", err)
+		log.Fatal(fmt.Sprintf("failed to register command endpoints: %v", err))
 	}
 }
 
@@ -84,7 +85,7 @@ func RegisterUploadAttachmentEndpoint(mux *runtime.ServeMux) {
 	err := mux.HandlePath("POST", "/api/v1/file", attachmentUploadHandler)
 
 	if err != nil {
-		logger.Fatal("failed to register file upload endpoint: %v", err)
+		log.Fatal(fmt.Sprintf("failed to register file upload endpoint: %v", err))
 	}
 }
 
@@ -190,7 +191,7 @@ func RegisterGetAttachmentContentEndpoint(mux *runtime.ServeMux) {
 	err := mux.HandlePath("POST", "/api/v1/file/content", getAttachmentContentHandler)
 
 	if err != nil {
-		logger.Fatal("failed to register get file endpoint: %v", err)
+		log.Fatal(fmt.Sprintf("failed to register get file endpoint: %v", err))
 	}
 }
 
@@ -288,6 +289,6 @@ func ErrorHandler(ctx context.Context, mux *runtime.ServeMux, marshaler runtime.
 
 	_, writeErr := w.Write([]byte(st.Message()))
 	if writeErr != nil {
-		logger.Fatal("failed to handle grpc error: %v", writeErr)
+		log.Fatal(fmt.Sprintf("failed to handle grpc error: %v", writeErr))
 	}
 }
diff --git a/internal/server/http_gateway.go b/internal/server/http_gateway.go
index 22d600e5d9a91ff4fb9caa6349a08be6ee1d9236..af1c870e280ccb7046d105a9bd22646ce6a4033a 100644
--- a/internal/server/http_gateway.go
+++ b/internal/server/http_gateway.go
@@ -29,7 +29,7 @@ import (
 	"context"
 	"fmt"
 	"net/http"
-
+    log "github.com/sirupsen/logrus"
 	"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
 	"google.golang.org/grpc/metadata"
 )
@@ -62,9 +62,9 @@ func StartHttpGateway() *http.Server {
 		Handler: RequestLoggingMiddleware(mux),
 	}
 
-	logger.Info("HTTP gateway listening on port %d", conf.Http.Server.Port)
+	log.Info(fmt.Sprintf("HTTP gateway listening on port %d", conf.Http.Server.Port))
 	if err := httpServer.ListenAndServe(); err != nil {
-		logger.Fatal("HTTP gateway failed to serve: %v", err)
+		log.Fatal(fmt.Sprintf("HTTP gateway failed to serve: %v", err))
 	}
 
 	return httpServer
diff --git a/internal/server/middleware.go b/internal/server/middleware.go
index 41710750de6006fed161507fd8ba65846ef1601b..e92479864b281cf44d22f0b8cac9f8620306fa85 100644
--- a/internal/server/middleware.go
+++ b/internal/server/middleware.go
@@ -30,6 +30,7 @@ import (
 	"fmt"
 	"io"
 	"net/http"
+	log "github.com/sirupsen/logrus"
 )
 
 const HomeUrlPath = "/"
@@ -53,21 +54,21 @@ func RequestLoggingMiddleware(h http.Handler) http.Handler {
 
 		body, err := io.ReadAll(r.Body)
 		if err != nil {
-			logger.Error("failed to read %v request body for %v: %v", r.Method, r.URL.Path, err)
+			log.Error(fmt.Sprintf("failed to read %v request body for %v: %v", r.Method, r.URL.Path, err))
 			http.Error(w, fmt.Sprintf("failed to read request body: %v", err), http.StatusBadRequest)
 			return
 		}
 		r.Body = io.NopCloser(bytes.NewReader(body))
 
-		logger.Debug("received %v request for %v with body: %v", r.Method, r.URL.Path, string(body))
+		log.Debug(fmt.Sprintf("received %v request for %v with body: %v", r.Method, r.URL.Path, string(body)))
 
 		lw := &logResponseWriter{w, http.StatusOK}
 		h.ServeHTTP(lw, r)
 
 		if lw.statusCode == http.StatusOK {
-			logger.Debug("successfully handled %v request for %v with body: %v", r.Method, r.URL.Path, string(body))
+			log.Debug(fmt.Sprintf("successfully handled %v request for %v with body: %v", r.Method, r.URL.Path, string(body)))
 		} else {
-			logger.Error("failed handling %v request for %v with body: %v, status code: %d", r.Method, r.URL.Path, string(body), lw.statusCode)
+			log.Error(fmt.Sprintf("failed handling %v request for %v with body: %v, status code: %d", r.Method, r.URL.Path, string(body), lw.statusCode))
 		}
 	})
 }