This commit is contained in:
2024-04-20 16:45:56 +03:00
commit 937c8d8eab
34 changed files with 3048 additions and 0 deletions

View File

@@ -0,0 +1,61 @@
package logger
import (
"github.com/rs/zerolog"
"net/http"
"time"
)
// responseData contains the data from the response.
type responseData struct {
status int
}
// loggingResponseWriter is a wrapper around http.ResponseWriter that keeps track of its HTTP status code and check response data errors
type loggingResponseWriter struct {
http.ResponseWriter
responseData *responseData
}
func (r *loggingResponseWriter) WriteHeader(statusCode int) {
r.ResponseWriter.WriteHeader(statusCode)
r.responseData.status = statusCode
}
// HTTPLoggerFunc create middleware that get status code and error message from response writer with Adapted logger
func HTTPLoggerFunc(logger zerolog.Logger, handler http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
ipAddress := r.Header.Get("X-Real-Ip")
if ipAddress == "" {
ipAddress = r.Header.Get("X-Forwarded-For")
}
responseData := &responseData{}
ww := loggingResponseWriter{
ResponseWriter: w,
responseData: responseData,
}
handler.ServeHTTP(&ww, r)
switch responseData.status {
case 200, 201, 202, 204:
logger.Info().
Dur("ms", time.Since(start)).
Str("url", r.URL.String()).
Str("mtd", r.Method).
Int("sts", responseData.status).
Str("ip", ipAddress).Send()
default:
logger.Error().
Dur("ms", time.Since(start)).
Str("url", r.URL.String()).
Int("sts", responseData.status).
Str("mtd", r.Method).
Str("ip", ipAddress).
Str("tkn", r.Header.Get("X-API-Key")).Send()
}
})
}

40
internal/adapters/logger/log.go Executable file
View File

@@ -0,0 +1,40 @@
package logger
import (
"gerald/internal/adapters/config"
"os"
"time"
"github.com/rs/zerolog"
"github.com/rs/zerolog/pkgerrors"
)
func NewLogger(config *config.Config) zerolog.Logger {
level, err := zerolog.ParseLevel(config.LoggingLevel)
if err != nil {
panic(err)
}
//zerolog global settings
zerolog.ErrorStackMarshaler = pkgerrors.MarshalStack
zerolog.LevelFieldName = "lvl"
zerolog.MessageFieldName = "msg"
zerolog.DurationFieldUnit = time.Millisecond
zerolog.DurationFieldInteger = true
//zerolog output settings
output := zerolog.ConsoleWriter{
Out: os.Stderr,
NoColor: false,
TimeFormat: time.Stamp,
PartsOrder: []string{
zerolog.TimestampFieldName,
zerolog.LevelFieldName,
zerolog.MessageFieldName,
zerolog.CallerFieldName,
},
}
//create adapted logger with output settings
return zerolog.New(output).Level(level).With().Timestamp().Logger()
}