package middleware import ( "fmt" "io" "log" "os" "time" "git.trcreatives.at/trcreatives/go-kite" ) type LoggerConfig struct { Output io.Writer Format func(method, path string, statusCode int, latency time.Duration) string Skip func(ctx *kite.Context) bool } func DefaultLoggerFormat(method, path string, statusCode int, latency time.Duration) string { return fmt.Sprintf("[Kite] %s %s -> %d in %s", method, path, statusCode, latency) } func Logger() kite.Middleware { return LoggerWithConfig(LoggerConfig{}) } func LoggerWithConfig(cfg LoggerConfig) kite.Middleware { if cfg.Output == nil { cfg.Output = os.Stdout } if cfg.Format == nil { cfg.Format = DefaultLoggerFormat } logger := log.New(cfg.Output, "", log.LstdFlags) return func(h kite.Handler) kite.Handler { return func(ctx *kite.Context) error { if cfg.Skip != nil && cfg.Skip(ctx) { return h(ctx) } start := time.Now() err := h(ctx) logger.Println(cfg.Format(ctx.GetMethod(), ctx.GetPath(), ctx.GetStatusCode(), time.Since(start))) return err } } }