diff --git a/go.mod b/go.mod index 849f6380956eb4bedc2fe5e39aa345e391c7fe14..244ef44e99c00e47a1625c2f976b77a1fccd8c55 100644 --- a/go.mod +++ b/go.mod @@ -1,20 +1,48 @@ module info-manager-proxy -go 1.22.0 + 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 + ) + + require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect + github.com/kelseyhightower/envconfig v1.4.0 + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/stretchr/testify v1.9.0 // 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/grpc v1.64.0 // indirect + google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.4.0 // indirect + google.golang.org/protobuf v1.34.2 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + <!-- + - Copyright (c) 2024. + - 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. + --> -require ( - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect - github.com/kelseyhightower/envconfig v1.4.0 - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/stretchr/testify v1.9.0 // 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/grpc v1.64.0 // indirect - google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.4.0 // indirect - google.golang.org/protobuf v1.34.2 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/internal/config/config.go b/internal/config/config.go index dec3a3a4ee7d79ce14549e26777a40131dc1fa97..920dc2dc8badfa82236af1a4a9c9bd1290b35bc4 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -28,7 +28,8 @@ package config import ( "github.com/kelseyhightower/envconfig" "gopkg.in/yaml.v3" - "log" + log "github.com/sirupsen/logrus" + "go.elastic.co/ecslogrus" "os" "regexp" "testing" diff --git a/internal/logging/logger.go b/internal/logging/logger.go deleted file mode 100644 index aedbf57d1b6247f836c11b17f62c65e44e140854..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 ( - "info-manager-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 e760453a43169d8578a1679e3537de0bb07f9918..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") - logOutput := buf.String() - assert.Contains(t, logOutput, "ERROR: test error") -} - -func TestWarning(t *testing.T) { - buf := logMessage(LogLevelWarning, "test warning") - logOutput := buf.String() - assert.Contains(t, logOutput, "WARNING: test warning") -} - -func TestInfo(t *testing.T) { - buf := logMessage(LogLevelInfo, "test info") - logOutput := buf.String() - assert.Contains(t, logOutput, "INFO: test info") -} - -func TestDebug(t *testing.T) { - buf := logMessage(LogLevelDebug, "test debug") - logOutput := buf.String() - assert.Empty(t, logOutput) -} diff --git a/internal/logging/testdata/config.yml b/internal/logging/testdata/config.yml deleted file mode 100644 index 6f5d5d32e43399a0dc52da8c6b66ee0128854cc4..0000000000000000000000000000000000000000 --- a/internal/logging/testdata/config.yml +++ /dev/null @@ -1,6 +0,0 @@ -server: - port: 8082 -grpc: - url: "localhost:50051" -logging: - level: "INFO" \ No newline at end of file diff --git a/internal/mock/globals.go b/internal/mock/globals.go index 024c66e9075e1c6f4df7922d5239f38447f16485..88449ee9ddbb51c3d8aff53ccdee75c2b16ab755 100644 --- a/internal/mock/globals.go +++ b/internal/mock/globals.go @@ -24,7 +24,3 @@ */ package mock - -import "info-manager-proxy/internal/logging" - -var logger = logging.GetLogger() diff --git a/internal/mock/grpc_server.go b/internal/mock/grpc_server.go index 445dc425bd399173cc3af16787db157dd9053eb0..7493219634f083f1dad9a977fb2332a3ce18385b 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" "context" "fmt" "google.golang.org/grpc" @@ -69,12 +70,12 @@ func StartGrpcServer() *grpc.Server { lis, err := net.Listen("tcp", fmt.Sprintf(":%d", GrpcMockPort)) 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", GrpcMockPort) + log.Info("gRPC server listening on port %v", GrpcMockPort) 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 eaa39597f85aae40529aa400ae55d7618f580e43..9abf4bcf7bd0f424041d56a8e1d03c065907a8c7 100644 --- a/internal/server/globals.go +++ b/internal/server/globals.go @@ -25,6 +25,3 @@ package server -import "info-manager-proxy/internal/logging" - -var logger = logging.GetLogger() diff --git a/internal/server/handler.go b/internal/server/handler.go index 5b79e4cf4f0954eda755ec6c515dc626179d0644..c05537b0435ecd4092f86da62ecaba15e23001da 100644 --- a/internal/server/handler.go +++ b/internal/server/handler.go @@ -34,6 +34,7 @@ import ( "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/status" pb "info-manager-proxy/gen/go" + log "github.com/sirupsen/logrus" "net/http" ) @@ -41,14 +42,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("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("failed to register home endpoint: %v", err) } } @@ -56,7 +57,7 @@ func RegisterInformationEndpoints(ctx context.Context, mux *runtime.ServeMux, gr opts := []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())} err := pb.RegisterInformationServiceHandlerFromEndpoint(ctx, mux, grpcUrl, opts) if err != nil { - logger.Fatal("failed to register information endpoints: %v", err) + log.Fatal(fmt.Sprintf("failed to register information endpoints: %v", err)) } } @@ -84,6 +85,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 bcbbf998025a7b88da00f85f5442359bc6ea6f6c..af3a8cbf2123acfe4bbe8db2c8580c899570abb5 100644 --- a/internal/server/http_gateway.go +++ b/internal/server/http_gateway.go @@ -31,7 +31,7 @@ import ( "info-manager-proxy/internal/config" "info-manager-proxy/internal/mock" "net/http" - + log "github.com/sirupsen/logrus" "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" ) @@ -54,9 +54,9 @@ func StartHttpGateway(conf config.Config) *http.Server { Handler: RequestLoggingMiddleware(mux), } - logger.Info("HTTP gateway listening on port %d", conf.Server.Port) + log.Info(fmt.Sprintf("HTTP gateway listening on port %d", conf.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)) } }) } diff --git a/internal/server/middleware_test.go b/internal/server/middleware_test.go index 0a304adc5bce634cccef8490507a353e9c3603e2..b1d3bd0bd93999e0b39276f299ae6409afc4c132 100644 --- a/internal/server/middleware_test.go +++ b/internal/server/middleware_test.go @@ -31,6 +31,7 @@ import ( "info-manager-proxy/internal/mock" "net/http" "testing" + log "github.com/sirupsen/logrus" ) func TestRequestLoggingMiddleware(t *testing.T) { @@ -39,12 +40,12 @@ func TestRequestLoggingMiddleware(t *testing.T) { SetUpHttpGateway() var buf bytes.Buffer - logger.BaseLogger.SetOutput(&buf) + log.Baselog.SetOutput(&buf) - originalFlags := logger.BaseLogger.Flags() + originalFlags := log.Baselog.Flags() defer func() { - logger.BaseLogger.SetOutput(nil) - logger.BaseLogger.SetFlags(originalFlags) + log.Baselog.SetOutput(nil) + log.Baselog.SetFlags(originalFlags) }() http.Get("http://localhost:8082/api/v1/information/testId") @@ -59,12 +60,12 @@ func TestRequestLoggingMiddleware(t *testing.T) { SetUpHttpGateway() var buf bytes.Buffer - logger.BaseLogger.SetOutput(&buf) + log.Baselog.SetOutput(&buf) - originalFlags := logger.BaseLogger.Flags() + originalFlags := log.Baselog.Flags() defer func() { - logger.BaseLogger.SetOutput(nil) - logger.BaseLogger.SetFlags(originalFlags) + log.Baselog.SetOutput(nil) + log.Baselog.SetFlags(originalFlags) }() http.Get("http://localhost:8082/")