init
This commit is contained in:
61
internal/adapters/logger/http.go
Executable file
61
internal/adapters/logger/http.go
Executable 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
40
internal/adapters/logger/log.go
Executable 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()
|
||||
}
|
||||
Reference in New Issue
Block a user