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,30 @@
package config
import (
"os"
"strconv"
)
var (
config *Config
)
type Config struct {
ApplicationName string
ApplicationPort int64
LoggingLevel string
PostgresDSN string
}
func GetConfig() *Config {
port, _ := strconv.ParseInt(os.Getenv("SERVING_PORT"), 10, 64)
config = &Config{
ApplicationName: os.Getenv("APP_NAME"),
ApplicationPort: port,
LoggingLevel: os.Getenv("LOGGING_LEVEL"),
PostgresDSN: os.Getenv("POSTGRES_DSN"),
}
return config
}

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()
}