From 62dc4921bf8de2de6a3a2b9a29189dfefa7e542c Mon Sep 17 00:00:00 2001 From: Dan Jones Date: Fri, 2 Feb 2024 06:08:25 -0600 Subject: [PATCH] feat(option): add WithPathLevel option (#72) --- logger.go | 9 +++++++++ logger_test.go | 38 ++++++++++++++++++++++++++++++++++++++ options.go | 7 +++++++ 3 files changed, 54 insertions(+) diff --git a/logger.go b/logger.go index dff00a0..41cd195 100644 --- a/logger.go +++ b/logger.go @@ -30,6 +30,8 @@ type config struct { clientErrorLevel zerolog.Level // the log level used for request with status code >= 500 serverErrorLevel zerolog.Level + // the log level to use for a specific path with status code < 400 + pathLevels map[string]zerolog.Level } var isTerm bool = isatty.IsTerminal(os.Stdout.Fd()) @@ -117,6 +119,8 @@ func SetLogger(opts ...Option) gin.HandlerFunc { msg = c.Errors.String() } + level, hasLevel := cfg.pathLevels[path] + switch { case c.Writer.Status() >= http.StatusBadRequest && c.Writer.Status() < http.StatusInternalServerError: { @@ -128,6 +132,11 @@ func SetLogger(opts ...Option) gin.HandlerFunc { l.WithLevel(cfg.serverErrorLevel). Msg(msg) } + case hasLevel: + { + l.WithLevel(level). + Msg(msg) + } default: l.WithLevel(cfg.defaultLevel). Msg(msg) diff --git a/logger_test.go b/logger_test.go index 0bf0e35..53bfb0d 100644 --- a/logger_test.go +++ b/logger_test.go @@ -188,6 +188,44 @@ func TestLoggerParseLevel(t *testing.T) { } } +func TestLoggerCustomLevel(t *testing.T) { + buffer := new(bytes.Buffer) + gin.SetMode(gin.ReleaseMode) + r := gin.New() + r.Use(SetLogger( + WithWriter(buffer), + WithDefaultLevel(zerolog.InfoLevel), + WithClientErrorLevel(zerolog.ErrorLevel), + WithServerErrorLevel(zerolog.FatalLevel), + WithPathLevel(map[string]zerolog.Level{ + "/example": zerolog.DebugLevel, + }), + )) + r.GET("/example", func(c *gin.Context) {}) + r.POST("/example", func(c *gin.Context) { + c.String(http.StatusBadRequest, "ok") + }) + r.PUT("/example", func(c *gin.Context) { + c.String(http.StatusBadGateway, "ok") + }) + r.GET("/example2", func(c *gin.Context) {}) + + performRequest(r, "GET", "/example") + assert.Contains(t, buffer.String(), "DBG") + + buffer.Reset() + performRequest(r, "GET", "/example2") + assert.Contains(t, buffer.String(), "INF") + + buffer.Reset() + performRequest(r, "POST", "/example") + assert.Contains(t, buffer.String(), "ERR") + + buffer.Reset() + performRequest(r, "PUT", "/example") + assert.Contains(t, buffer.String(), "FTL") +} + func BenchmarkLogger(b *testing.B) { gin.SetMode(gin.ReleaseMode) r := gin.New() diff --git a/options.go b/options.go index 933b11d..ac7c0b4 100644 --- a/options.go +++ b/options.go @@ -53,6 +53,13 @@ func WithSkipPath(s []string) Option { }) } +// WithPathLevel use logging level for successful requests to a specific path +func WithPathLevel(m map[string]zerolog.Level) Option { + return optionFunc(func(c *config) { + c.pathLevels = m + }) +} + // WithWriter change the default output writer. // Default is gin.DefaultWriter func WithWriter(s io.Writer) Option {