diff --git a/README.md b/README.md index 3cc000183e635ba3032c7aafac63fcc8c2404a49..c85718ee13066ca8a689c63e7e3ce529559477e3 100644 --- a/README.md +++ b/README.md @@ -42,4 +42,6 @@ server: grpc: mock: lokalen gRPC Server mocken (bool) url: URL des Ziel-gRPC-Servers im host:port Format (string) +logging: + level: "ERROR" | "WARN" | "INFO" | "DEBUG" ``` \ No newline at end of file diff --git a/cmd/fachstellen-proxy/main.go b/cmd/fachstellen-proxy/main.go index 4b8898ca9272c0f841471b0d4b497c6af830fc1a..c6a993e9a18aedf3d364e250ff3e18c62cf8026c 100644 --- a/cmd/fachstellen-proxy/main.go +++ b/cmd/fachstellen-proxy/main.go @@ -29,16 +29,12 @@ import ( "fachstellen-proxy/internal/config" "fachstellen-proxy/internal/mock" "fachstellen-proxy/internal/server" - "log" ) var version = "v1.0.0-beta.1" func main() { - conf, err := config.LoadConfig() - if err != nil { - log.Fatalf("error loading config: %v", err) - } + conf := config.LoadConfig() if conf.Grpc.Mock { go mock.StartGrpcServer() diff --git a/config/config.yml b/config/config.yml index d5f31932f3bc6d39f1aaf481538bd7976d85b771..8605b248d11050d5a8ad3c71b3e41e20eb8993d6 100755 --- a/config/config.yml +++ b/config/config.yml @@ -1,4 +1,6 @@ server: port: 8082 grpc: - mock: true \ No newline at end of file + mock: true +logging: + level: "INFO" \ No newline at end of file diff --git a/internal/config/config.go b/internal/config/config.go index 06184cc057f55677bfe91bb53b9904ae78e3dcb6..b246c3d63d3ad026e142c890f9532722f122358e 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -26,15 +26,19 @@ package config import ( - "fmt" "github.com/kelseyhightower/envconfig" "gopkg.in/yaml.v3" + "log" "os" "regexp" + "testing" ) -const defaultFilePath = "config/config.yml" -const grpcUrlRegex = `^[A-Za-z\d-]+(\.[A-Za-z\d-]+){0,512}:\d{1,5}$` +const ( + defaultFilePath = "config/config.yml" + testFilePath = "testdata/test_config.yml" + grpcUrlRegex = `^[A-Za-z\d-]+(\.[A-Za-z\d-]+){0,512}:\d{1,5}$` +) type Config struct { Server struct { @@ -44,36 +48,41 @@ type Config struct { Mock bool `yaml:"mock" envconfig:"GRPC_MOCK"` Url string `yaml:"url" envconfig:"GRPC_URL"` } `yaml:"grpc"` + Logging struct { + Level string `yaml:"level" envconfig:"LOGGING_LEVEL"` + } `yaml:"logging"` } -func LoadConfig(filePath ...string) (Config, error) { +func LoadConfig(configFilePath ...string) Config { var config Config fp := defaultFilePath - if len(filePath) > 0 { - fp = filePath[0] + if len(configFilePath) > 0 { + fp = configFilePath[0] + } else if testing.Testing() { + fp = testFilePath } file, err := os.ReadFile(fp) if err != nil { - return config, fmt.Errorf("error reading YAML file: %v", err) + log.Fatalf("FATAL: error reading YAML file: %v", err) } err = yaml.Unmarshal(file, &config) if err != nil { - return config, fmt.Errorf("error unmarshalling YAML file: %v", err) + log.Fatalf("FATAL: error unmarshalling YAML file: %v", err) } err = envconfig.Process("", &config) if err != nil { - return config, fmt.Errorf("error reading env: %v", err) + log.Fatalf("FATAL: error reading env: %v", err) } if len(config.Grpc.Url) > 0 && !ValidateGrpcUrl(config.Grpc.Url) { - return config, fmt.Errorf("gRPC URL is not in host:port format") + log.Fatalf("FATAL: gRPC URL is not in host:port format") } - return config, nil + return config } func ValidateGrpcUrl(grpcUrl string) bool { diff --git a/internal/config/config_test.go b/internal/config/config_test.go index 1b97338a29d3a9f36c1cd1c690bde4b88d51afa1..38cd14245895c0ba67c51af3f41cd7d3faf899f9 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -34,29 +34,29 @@ import ( func TestLoadConfig(t *testing.T) { t.Run("should load config from file", func(t *testing.T) { - config, err := LoadConfig("testdata/test_config.yml") - assert.NoError(t, err, "LoadConfig should not return an error") + config := LoadConfig() expectedConfig := Config{} expectedConfig.Server.Port = 8080 expectedConfig.Grpc.Url = "localhost:50051" expectedConfig.Grpc.Mock = false + expectedConfig.Logging.Level = "DEBUG" assert.Equal(t, expectedConfig, config) }) t.Run("should load config from env", func(t *testing.T) { envVars := map[string]string{ - "SERVER_PORT": "9090", - "GRPC_URL": "localhost:99999", + "SERVER_PORT": "9090", + "GRPC_URL": "localhost:99999", + "LOGGING_LEVEL": "ERROR", } for key, value := range envVars { assert.NoError(t, os.Setenv(key, value), "Setenv "+key+" should not return an error") } - config, err := LoadConfig("testdata/empty_test_config.yml") - assert.NoError(t, err, "LoadConfig should not return an error") + config := LoadConfig("testdata/empty_test_config.yml") for key := range envVars { assert.NoError(t, os.Unsetenv(key), "Unsetenv "+key+" should not return an error") @@ -66,6 +66,7 @@ func TestLoadConfig(t *testing.T) { expectedConfig.Server.Port = 9090 expectedConfig.Grpc.Url = "localhost:99999" expectedConfig.Grpc.Mock = false + expectedConfig.Logging.Level = "ERROR" assert.Equal(t, expectedConfig, config) }) @@ -73,8 +74,7 @@ func TestLoadConfig(t *testing.T) { t.Run("should overwrite config with env", func(t *testing.T) { assert.NoError(t, os.Setenv("SERVER_PORT", "9090"), "Setenv SERVER_PORT should not return an error") - config, err := LoadConfig("testdata/test_config.yml") - assert.NoError(t, err, "LoadConfig should not return an error") + config := LoadConfig() assert.NoError(t, os.Unsetenv("SERVER_PORT"), "Unsetenv SERVER_PORT should not return an error") @@ -82,6 +82,7 @@ func TestLoadConfig(t *testing.T) { expectedConfig.Server.Port = 9090 expectedConfig.Grpc.Url = "localhost:50051" expectedConfig.Grpc.Mock = false + expectedConfig.Logging.Level = "DEBUG" assert.Equal(t, expectedConfig, config) }) diff --git a/internal/config/testdata/test_config.yml b/internal/config/testdata/test_config.yml index 10a074db9816f23c5dd0f3199d86ee2f3385cc13..ea8925db9cb5af5c351a1af92d6fb7f878de4359 100644 --- a/internal/config/testdata/test_config.yml +++ b/internal/config/testdata/test_config.yml @@ -1,4 +1,6 @@ server: port: 8080 grpc: - url: "localhost:50051" \ No newline at end of file + url: "localhost:50051" +logging: + level: "DEBUG" \ No newline at end of file diff --git a/internal/logging/logger.go b/internal/logging/logger.go new file mode 100644 index 0000000000000000000000000000000000000000..6ce32e5aa9333b372d482136855f19c67ca9c5d8 --- /dev/null +++ b/internal/logging/logger.go @@ -0,0 +1,113 @@ +/* + * 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 ( + "fachstellen-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 new file mode 100644 index 0000000000000000000000000000000000000000..11eff2f85f749fc9bcd884ee9d57c7a9b13fe12d --- /dev/null +++ b/internal/logging/logger_test.go @@ -0,0 +1,82 @@ +/* + * 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" + "log" + "testing" +) + +func setUpLogger(t *testing.T, level string, msg string) *bytes.Buffer { + logger := GetLogger() + + var buf bytes.Buffer + logger.BaseLogger.SetOutput(&buf) + + originalFlags := log.Flags() + t.Cleanup(func() { + log.SetOutput(nil) + log.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 := setUpLogger(t, LogLevelError, "test error") + logOutput := buf.String() + assert.Contains(t, logOutput, "ERROR: test error") +} + +func TestWarning(t *testing.T) { + buf := setUpLogger(t, LogLevelWarning, "test warning") + logOutput := buf.String() + assert.Contains(t, logOutput, "WARNING: test warning") +} + +func TestInfo(t *testing.T) { + buf := setUpLogger(t, LogLevelInfo, "test info") + logOutput := buf.String() + assert.Contains(t, logOutput, "INFO: test info") +} + +func TestDebug(t *testing.T) { + buf := setUpLogger(t, LogLevelDebug, "test debug") + logOutput := buf.String() + assert.Empty(t, logOutput) +} diff --git a/internal/logging/testdata/test_config.yml b/internal/logging/testdata/test_config.yml new file mode 100644 index 0000000000000000000000000000000000000000..6021893b2e1982f4f8d4215707fa6300e2cd6e8e --- /dev/null +++ b/internal/logging/testdata/test_config.yml @@ -0,0 +1,6 @@ +server: + port: 8080 +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 new file mode 100644 index 0000000000000000000000000000000000000000..b08a0f5c817db69d342f9704224dbe0c3789b883 --- /dev/null +++ b/internal/mock/globals.go @@ -0,0 +1,5 @@ +package mock + +import "fachstellen-proxy/internal/logging" + +var logger = logging.GetLogger() diff --git a/internal/mock/grpc_server.go b/internal/mock/grpc_server.go index 8050c2414e1a61176c7a70e8769eed3e14115ae7..729525c994e777903b5877ef109e254031293bcc 100644 --- a/internal/mock/grpc_server.go +++ b/internal/mock/grpc_server.go @@ -32,7 +32,6 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - "log" "net" ) @@ -61,14 +60,15 @@ func (s *server) Register(ctx context.Context, in *pb.GrpcFachstelleRegistration func StartGrpcServer() *grpc.Server { s := grpc.NewServer() pb.RegisterFachstelleRegistrationServiceServer(s, &server{}) + lis, err := net.Listen("tcp", fmt.Sprintf(":%d", GrpcMockPort)) if err != nil { - log.Fatalf("gRPC server failed to listen: %v", err) + logger.Fatal("gRPC server failed to listen: %v", err) } - log.Printf("gRPC server listening on port %d", GrpcMockPort) + logger.Info("gRPC server listening on port %v", GrpcMockPort) if err := s.Serve(lis); err != nil { - log.Fatalf("gRPC server failed to serve: %v", err) + logger.Fatal("gRPC server failed to serve: %v", err) } return s diff --git a/internal/mock/grpc_server_test.go b/internal/mock/grpc_server_test.go index 1cdef0ca1bf5e4c5150c84f30df00f59e005c6c2..b7a4309ea9fb7b52f372928488b849f5c3ef84ca 100644 --- a/internal/mock/grpc_server_test.go +++ b/internal/mock/grpc_server_test.go @@ -36,14 +36,24 @@ import ( ) func TestStartGrpcServer(t *testing.T) { - t.Run("should have no error", func(t *testing.T) { + setUpGrpcEnv := func() (pb.FachstelleRegistrationServiceClient, func()) { SetUpGrpcServer() conn, err := grpc.NewClient(fmt.Sprintf("localhost:%d", GrpcMockPort), grpc.WithTransportCredentials(insecure.NewCredentials())) assert.NoError(t, err) - defer conn.Close() + cleanup := func() { + conn.Close() + } client := pb.NewFachstelleRegistrationServiceClient(conn) + + return client, cleanup + } + + t.Run("should have no error", func(t *testing.T) { + client, cleanUp := setUpGrpcEnv() + defer cleanUp() + resp, err := client.Register(context.Background(), &pb.GrpcFachstelleRegistrationRequest{Fachstelle: &pb.GrpcFachstelle{MukId: "testMukId"}}) assert.NoError(t, err) @@ -51,13 +61,9 @@ func TestStartGrpcServer(t *testing.T) { }) t.Run("should have error", func(t *testing.T) { - SetUpGrpcServer() + client, cleanUp := setUpGrpcEnv() + defer cleanUp() - conn, err := grpc.NewClient(fmt.Sprintf("localhost:%d", GrpcMockPort), grpc.WithTransportCredentials(insecure.NewCredentials())) - assert.NoError(t, err) - defer conn.Close() - - client := pb.NewFachstelleRegistrationServiceClient(conn) resp, err := client.Register(context.Background(), &pb.GrpcFachstelleRegistrationRequest{}) assert.Error(t, err) diff --git a/internal/mock/testdata/test_config.yml b/internal/mock/testdata/test_config.yml new file mode 100644 index 0000000000000000000000000000000000000000..ea8925db9cb5af5c351a1af92d6fb7f878de4359 --- /dev/null +++ b/internal/mock/testdata/test_config.yml @@ -0,0 +1,6 @@ +server: + port: 8080 +grpc: + url: "localhost:50051" +logging: + level: "DEBUG" \ No newline at end of file diff --git a/internal/server/globals.go b/internal/server/globals.go new file mode 100644 index 0000000000000000000000000000000000000000..2ac6c4f087be0e6c7ac987c16203e805fe33a552 --- /dev/null +++ b/internal/server/globals.go @@ -0,0 +1,5 @@ +package server + +import "fachstellen-proxy/internal/logging" + +var logger = logging.GetLogger() diff --git a/internal/server/handler.go b/internal/server/handler.go index 1cc208f81155b920f04f44a980623fb30a8596f9..3d22eb8fc72bcd32d2e28f676fb07f87aeafdd13 100644 --- a/internal/server/handler.go +++ b/internal/server/handler.go @@ -31,7 +31,6 @@ import ( "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - "log" "net/http" ) @@ -39,14 +38,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 { - log.Printf("failed to recover: %v", err) + logger.Error("failed to recover: %v", err) http.Error(w, fmt.Sprintf("failed to recover: %v", err), http.StatusInternalServerError) } }() }) if err != nil { - log.Fatalf("failed to register home endpoint: %v", err) + logger.Fatal("failed to register home endpoint: %v", err) } } @@ -74,6 +73,6 @@ func ErrorHandler(ctx context.Context, mux *runtime.ServeMux, marshaler runtime. _, writeErr := w.Write([]byte(st.Message())) if writeErr != nil { - log.Fatalf("failed to handle grpc error: %v", writeErr) + logger.Fatal("failed to handle grpc error: %v", writeErr) } } diff --git a/internal/server/handler_test.go b/internal/server/handler_test.go index b29d1722fb885d2e149619b5eba2e20a18f28c52..6cf686e466a16158d655f42a73d99d84f8118564 100644 --- a/internal/server/handler_test.go +++ b/internal/server/handler_test.go @@ -44,47 +44,37 @@ func TestRegisterHomeEndpoint(t *testing.T) { } func TestErrorHandler(t *testing.T) { - t.Run("should have bad request error", func(t *testing.T) { + assertErroneousRequest := func(jsonData []byte, expectedStatusCode int) { mock.SetUpGrpcServer() SetUpHttpGateway() - jsonData := []byte(`{}`) resp, err := http.Post(fmt.Sprintf("http://localhost:8080%v", RegisterFachstelleUrlPath), "application/json", bytes.NewBuffer(jsonData)) assert.NoError(t, err) - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) + assert.Equal(t, expectedStatusCode, resp.StatusCode) + } + + t.Run("should have bad request error", func(t *testing.T) { + jsonData := []byte(`{}`) + + assertErroneousRequest(jsonData, http.StatusBadRequest) }) t.Run("should have conflict error", func(t *testing.T) { - mock.SetUpGrpcServer() - SetUpHttpGateway() - jsonData := []byte(`{"fachstelle": {"mukId": "conflictMukId"}}`) - resp, err := http.Post(fmt.Sprintf("http://localhost:8080%v", RegisterFachstelleUrlPath), "application/json", bytes.NewBuffer(jsonData)) - assert.NoError(t, err) - assert.Equal(t, http.StatusConflict, resp.StatusCode) + assertErroneousRequest(jsonData, http.StatusConflict) }) t.Run("should have unavailable error", func(t *testing.T) { - mock.SetUpGrpcServer() - SetUpHttpGateway() - jsonData := []byte(`{"fachstelle": {"mukId": "unavailableMukId"}}`) - resp, err := http.Post(fmt.Sprintf("http://localhost:8080%v", RegisterFachstelleUrlPath), "application/json", bytes.NewBuffer(jsonData)) - assert.NoError(t, err) - assert.Equal(t, http.StatusServiceUnavailable, resp.StatusCode) + assertErroneousRequest(jsonData, http.StatusServiceUnavailable) }) t.Run("should have internal server error", func(t *testing.T) { - mock.SetUpGrpcServer() - SetUpHttpGateway() - jsonData := []byte(`{"fachstelle": {"mukId": "erroneousMukId"}}`) - resp, err := http.Post(fmt.Sprintf("http://localhost:8080%v", RegisterFachstelleUrlPath), "application/json", bytes.NewBuffer(jsonData)) - assert.NoError(t, err) - assert.Equal(t, http.StatusInternalServerError, resp.StatusCode) + assertErroneousRequest(jsonData, http.StatusInternalServerError) }) } diff --git a/internal/server/http_gateway.go b/internal/server/http_gateway.go index bcf3cf7dc7a8214e24a7e45fda3d4255feb448da..5906889cb9e2847e6c6466443fc813ec4adafde7 100644 --- a/internal/server/http_gateway.go +++ b/internal/server/http_gateway.go @@ -31,7 +31,6 @@ import ( "fachstellen-proxy/internal/mock" "fmt" "google.golang.org/grpc/credentials/insecure" - "log" "net/http" "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" @@ -54,7 +53,7 @@ func StartHttpGateway(conf config.Config) *http.Server { opts := []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())} err := pb.RegisterFachstelleRegistrationServiceHandlerFromEndpoint(ctx, mux, grpcEndpoint, opts) if err != nil { - log.Fatalf("failed to start HTTP gateway: %v", err) + logger.Fatal("failed to start HTTP gateway: %v", err) } RegisterHomeEndpoint(mux) @@ -64,9 +63,9 @@ func StartHttpGateway(conf config.Config) *http.Server { Handler: RequestLoggingMiddleware(mux), } - log.Printf("HTTP gateway listening on port %d", conf.Server.Port) + logger.Info("HTTP gateway listening on port %d", conf.Server.Port) if err := httpServer.ListenAndServe(); err != nil { - log.Fatalf("HTTP gateway failed to serve: %v", err) + logger.Fatal("HTTP gateway failed to serve: %v", err) } return httpServer diff --git a/internal/server/middleware.go b/internal/server/middleware.go index ab9ed8b25b022cece0f5a814589fd3a4624ba4fc..fdab80b369121d04af22fe2cc6a0f2dd85a01b34 100644 --- a/internal/server/middleware.go +++ b/internal/server/middleware.go @@ -28,9 +28,7 @@ package server import ( "bytes" "fmt" - "google.golang.org/grpc/grpclog" "io" - "log" "net/http" ) @@ -55,21 +53,21 @@ func RequestLoggingMiddleware(h http.Handler) http.Handler { body, err := io.ReadAll(r.Body) if err != nil { - log.Printf("failed to read request body: %v", err) + logger.Error("failed to read request body: %v", err) http.Error(w, fmt.Sprintf("failed to read request body: %v", err), http.StatusBadRequest) return } r.Body = io.NopCloser(bytes.NewReader(body)) - log.Printf("received request with body: %v", string(body)) + logger.Debug("received request with body: %v", string(body)) lw := &logResponseWriter{w, http.StatusOK} h.ServeHTTP(lw, r) if lw.statusCode == http.StatusOK { - log.Printf("successfully handled request with body: %v", string(body)) + logger.Debug("successfully handled request with body: %v", string(body)) } else { - grpclog.Errorf("failed handling request with body: %v, status code: %d", string(body), lw.statusCode) + logger.Error("failed handling request with body: %v, status code: %d", string(body), lw.statusCode) } }) } diff --git a/internal/server/middleware_test.go b/internal/server/middleware_test.go index 06aaa8ea764ae586d820ebc821bb9f97d8488620..b69bed46805ec058e48d8b01d33b0f50eb075901 100644 --- a/internal/server/middleware_test.go +++ b/internal/server/middleware_test.go @@ -40,7 +40,7 @@ func TestRequestLoggingMiddleware(t *testing.T) { SetUpHttpGateway() var buf bytes.Buffer - log.SetOutput(&buf) + logger.BaseLogger.SetOutput(&buf) originalFlags := log.Flags() defer func() { diff --git a/internal/server/test_setup.go b/internal/server/test_setup.go index bd5f4e29d14cdbc7014d5f77d2d630faf722d102..5c3fd654df03385a9d008e716c93c7a60843b6cf 100644 --- a/internal/server/test_setup.go +++ b/internal/server/test_setup.go @@ -35,9 +35,7 @@ var setUpOnce sync.Once func SetUpHttpGateway() { setUpOnce.Do(func() { - conf := config.Config{} - conf.Server.Port = 8080 - conf.Grpc.Mock = true + conf := config.LoadConfig() go StartHttpGateway(conf) time.Sleep(time.Second) // Wait for the server to start diff --git a/internal/server/testdata/test_config.yml b/internal/server/testdata/test_config.yml new file mode 100644 index 0000000000000000000000000000000000000000..6235966c8828f67d39820aeb96b70781ca9300f7 --- /dev/null +++ b/internal/server/testdata/test_config.yml @@ -0,0 +1,6 @@ +server: + port: 8080 +grpc: + mock: true +logging: + level: "DEBUG" \ No newline at end of file