Skip to content
Snippets Groups Projects
Commit 051274ac authored by OZGCloud's avatar OZGCloud
Browse files

OZG-6346 auf ecs log format umgestellt

parent 405de7c0
Branches
Tags
No related merge requests found
module info-manager-proxy 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 ( require (
github.com/davecgh/go-spew v1.1.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect
...@@ -17,4 +25,24 @@ require ( ...@@ -17,4 +25,24 @@ require (
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.4.0 // indirect google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.4.0 // indirect
google.golang.org/protobuf v1.34.2 // indirect google.golang.org/protobuf v1.34.2 // indirect
gopkg.in/yaml.v3 v3.0.1 // 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.
-->
) )
...@@ -28,7 +28,8 @@ package config ...@@ -28,7 +28,8 @@ package config
import ( import (
"github.com/kelseyhightower/envconfig" "github.com/kelseyhightower/envconfig"
"gopkg.in/yaml.v3" "gopkg.in/yaml.v3"
"log" log "github.com/sirupsen/logrus"
"go.elastic.co/ecslogrus"
"os" "os"
"regexp" "regexp"
"testing" "testing"
......
/*
* 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...)
}
/*
* 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)
}
server:
port: 8082
grpc:
url: "localhost:50051"
logging:
level: "INFO"
\ No newline at end of file
...@@ -24,7 +24,3 @@ ...@@ -24,7 +24,3 @@
*/ */
package mock package mock
import "info-manager-proxy/internal/logging"
var logger = logging.GetLogger()
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
package mock package mock
import ( import (
log "github.com/sirupsen/logrus"
"context" "context"
"fmt" "fmt"
"google.golang.org/grpc" "google.golang.org/grpc"
...@@ -69,12 +70,12 @@ func StartGrpcServer() *grpc.Server { ...@@ -69,12 +70,12 @@ func StartGrpcServer() *grpc.Server {
lis, err := net.Listen("tcp", fmt.Sprintf(":%d", GrpcMockPort)) lis, err := net.Listen("tcp", fmt.Sprintf(":%d", GrpcMockPort))
if err != nil { 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 { 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 return s
......
...@@ -25,6 +25,3 @@ ...@@ -25,6 +25,3 @@
package server package server
import "info-manager-proxy/internal/logging"
var logger = logging.GetLogger()
...@@ -34,6 +34,7 @@ import ( ...@@ -34,6 +34,7 @@ import (
"google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/credentials/insecure"
"google.golang.org/grpc/status" "google.golang.org/grpc/status"
pb "info-manager-proxy/gen/go" pb "info-manager-proxy/gen/go"
log "github.com/sirupsen/logrus"
"net/http" "net/http"
) )
...@@ -41,14 +42,14 @@ func RegisterHomeEndpoint(mux *runtime.ServeMux) { ...@@ -41,14 +42,14 @@ func RegisterHomeEndpoint(mux *runtime.ServeMux) {
err := mux.HandlePath("GET", "/", func(w http.ResponseWriter, r *http.Request, pathParams map[string]string) { err := mux.HandlePath("GET", "/", func(w http.ResponseWriter, r *http.Request, pathParams map[string]string) {
defer func() { defer func() {
if err := recover(); err != nil { 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) http.Error(w, fmt.Sprintf("failed to recover: %v", err), http.StatusInternalServerError)
} }
}() }()
}) })
if err != nil { 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 ...@@ -56,7 +57,7 @@ func RegisterInformationEndpoints(ctx context.Context, mux *runtime.ServeMux, gr
opts := []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())} opts := []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())}
err := pb.RegisterInformationServiceHandlerFromEndpoint(ctx, mux, grpcUrl, opts) err := pb.RegisterInformationServiceHandlerFromEndpoint(ctx, mux, grpcUrl, opts)
if err != nil { 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. ...@@ -84,6 +85,6 @@ func ErrorHandler(ctx context.Context, mux *runtime.ServeMux, marshaler runtime.
_, writeErr := w.Write([]byte(st.Message())) _, writeErr := w.Write([]byte(st.Message()))
if writeErr != nil { if writeErr != nil {
logger.Fatal("failed to handle grpc error: %v", writeErr) log.Fatal(fmt.Sprintf("failed to handle grpc error: %v", writeErr))
} }
} }
...@@ -31,7 +31,7 @@ import ( ...@@ -31,7 +31,7 @@ import (
"info-manager-proxy/internal/config" "info-manager-proxy/internal/config"
"info-manager-proxy/internal/mock" "info-manager-proxy/internal/mock"
"net/http" "net/http"
log "github.com/sirupsen/logrus"
"github.com/grpc-ecosystem/grpc-gateway/v2/runtime" "github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
) )
...@@ -54,9 +54,9 @@ func StartHttpGateway(conf config.Config) *http.Server { ...@@ -54,9 +54,9 @@ func StartHttpGateway(conf config.Config) *http.Server {
Handler: RequestLoggingMiddleware(mux), 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 { 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 return httpServer
......
...@@ -30,6 +30,7 @@ import ( ...@@ -30,6 +30,7 @@ import (
"fmt" "fmt"
"io" "io"
"net/http" "net/http"
log "github.com/sirupsen/logrus"
) )
const HomeUrlPath = "/" const HomeUrlPath = "/"
...@@ -53,21 +54,21 @@ func RequestLoggingMiddleware(h http.Handler) http.Handler { ...@@ -53,21 +54,21 @@ func RequestLoggingMiddleware(h http.Handler) http.Handler {
body, err := io.ReadAll(r.Body) body, err := io.ReadAll(r.Body)
if err != nil { 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) http.Error(w, fmt.Sprintf("failed to read request body: %v", err), http.StatusBadRequest)
return return
} }
r.Body = io.NopCloser(bytes.NewReader(body)) 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} lw := &logResponseWriter{w, http.StatusOK}
h.ServeHTTP(lw, r) h.ServeHTTP(lw, r)
if lw.statusCode == http.StatusOK { 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 { } 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))
} }
}) })
} }
...@@ -31,6 +31,7 @@ import ( ...@@ -31,6 +31,7 @@ import (
"info-manager-proxy/internal/mock" "info-manager-proxy/internal/mock"
"net/http" "net/http"
"testing" "testing"
log "github.com/sirupsen/logrus"
) )
func TestRequestLoggingMiddleware(t *testing.T) { func TestRequestLoggingMiddleware(t *testing.T) {
...@@ -39,12 +40,12 @@ func TestRequestLoggingMiddleware(t *testing.T) { ...@@ -39,12 +40,12 @@ func TestRequestLoggingMiddleware(t *testing.T) {
SetUpHttpGateway() SetUpHttpGateway()
var buf bytes.Buffer var buf bytes.Buffer
logger.BaseLogger.SetOutput(&buf) log.Baselog.SetOutput(&buf)
originalFlags := logger.BaseLogger.Flags() originalFlags := log.Baselog.Flags()
defer func() { defer func() {
logger.BaseLogger.SetOutput(nil) log.Baselog.SetOutput(nil)
logger.BaseLogger.SetFlags(originalFlags) log.Baselog.SetFlags(originalFlags)
}() }()
http.Get("http://localhost:8082/api/v1/information/testId") http.Get("http://localhost:8082/api/v1/information/testId")
...@@ -59,12 +60,12 @@ func TestRequestLoggingMiddleware(t *testing.T) { ...@@ -59,12 +60,12 @@ func TestRequestLoggingMiddleware(t *testing.T) {
SetUpHttpGateway() SetUpHttpGateway()
var buf bytes.Buffer var buf bytes.Buffer
logger.BaseLogger.SetOutput(&buf) log.Baselog.SetOutput(&buf)
originalFlags := logger.BaseLogger.Flags() originalFlags := log.Baselog.Flags()
defer func() { defer func() {
logger.BaseLogger.SetOutput(nil) log.Baselog.SetOutput(nil)
logger.BaseLogger.SetFlags(originalFlags) log.Baselog.SetFlags(originalFlags)
}() }()
http.Get("http://localhost:8082/") http.Get("http://localhost:8082/")
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment