From dbd3b26f6c9455ee484aabcb366a54a38b88415a Mon Sep 17 00:00:00 2001 From: Dan Sosedoff Date: Tue, 6 Dec 2022 12:09:21 -0600 Subject: [PATCH 1/4] Configure logging level and format --- pkg/api/logger.go | 3 ++- pkg/cli/cli.go | 28 ++++++++++++++++++++++++++-- pkg/command/options.go | 8 ++++++++ 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/pkg/api/logger.go b/pkg/api/logger.go index 2f0b15c..7d5fea8 100644 --- a/pkg/api/logger.go +++ b/pkg/api/logger.go @@ -55,6 +55,7 @@ func RequestLogger(logger *logrus.Logger) gin.HandlerFunc { "method": c.Request.Method, "remote_addr": c.ClientIP(), "duration": latency, + "path": path, } if err := c.Errors.Last(); err != nil { @@ -66,7 +67,7 @@ func RequestLogger(logger *logrus.Logger) gin.HandlerFunc { fields["raw_query"] = c.Request.URL.RawQuery } - entry := logrus.WithFields(fields) + entry := logger.WithFields(fields) msg := "http_request " + path switch { diff --git a/pkg/cli/cli.go b/pkg/cli/cli.go index bb3e306..b36778c 100644 --- a/pkg/cli/cli.go +++ b/pkg/cli/cli.go @@ -158,8 +158,9 @@ func initOptions() { os.Exit(0) } - if options.Debug { - logger.SetLevel(logrus.DebugLevel) + if err := configureLogger(opts); err != nil { + exitWithMessage(err.Error()) + return } if options.ReadOnly { @@ -175,6 +176,29 @@ func initOptions() { printVersion() } +func configureLogger(opts command.Options) error { + if options.Debug { + logger.SetLevel(logrus.DebugLevel) + } else { + lvl, err := logrus.ParseLevel(opts.LogLevel) + if err != nil { + return err + } + logger.SetLevel(lvl) + } + + switch options.LogFormat { + case "text": + logger.SetFormatter(&logrus.TextFormatter{}) + case "json": + logger.SetFormatter(&logrus.JSONFormatter{}) + default: + return fmt.Errorf("invalid logger format: %v", options.LogFormat) + } + + return nil +} + func printVersion() { chunks := []string{fmt.Sprintf("Pgweb v%s", command.Version)} diff --git a/pkg/command/options.go b/pkg/command/options.go index 643d2aa..05f19d6 100644 --- a/pkg/command/options.go +++ b/pkg/command/options.go @@ -8,6 +8,7 @@ import ( "strings" "github.com/jessevdk/go-flags" + "github.com/sirupsen/logrus" ) const ( @@ -18,6 +19,8 @@ const ( type Options struct { Version bool `short:"v" long:"version" description:"Print version"` Debug bool `short:"d" long:"debug" description:"Enable debugging mode"` + LogLevel string `long:"log-level" description:"Logging level" default:"info"` + LogFormat string `long:"log-format" description:"Logging output format" default:"text"` URL string `long:"url" description:"Database connection string"` Host string `long:"host" description:"Server hostname or IP" default:"localhost"` Port int `long:"port" description:"Server port" default:"5432"` @@ -62,6 +65,11 @@ func ParseOptions(args []string) (Options, error) { return opts, err } + _, err = logrus.ParseLevel(opts.LogLevel) + if err != nil { + return opts, err + } + if opts.URL == "" { opts.URL = getPrefixedEnvVar("DATABASE_URL") } From dda70352c03e4f13758a820f38825c2841dd76f1 Mon Sep 17 00:00:00 2001 From: Dan Sosedoff Date: Tue, 6 Dec 2022 12:14:55 -0600 Subject: [PATCH 2/4] Dont include request path in the log twice --- pkg/api/logger.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/api/logger.go b/pkg/api/logger.go index 7d5fea8..88d54b6 100644 --- a/pkg/api/logger.go +++ b/pkg/api/logger.go @@ -68,7 +68,7 @@ func RequestLogger(logger *logrus.Logger) gin.HandlerFunc { } entry := logger.WithFields(fields) - msg := "http_request " + path + msg := "http_request" switch { case status >= http.StatusBadRequest && status < http.StatusInternalServerError: From 2f9d737515b5f6de8c669cd03285a0f0de066063 Mon Sep 17 00:00:00 2001 From: Dan Sosedoff Date: Tue, 6 Dec 2022 12:24:21 -0600 Subject: [PATCH 3/4] Move request parameters logging into api request logger --- pkg/api/logger.go | 7 +++++++ pkg/api/middleware.go | 9 --------- pkg/api/routes.go | 4 ---- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/pkg/api/logger.go b/pkg/api/logger.go index 88d54b6..04a57e1 100644 --- a/pkg/api/logger.go +++ b/pkg/api/logger.go @@ -65,6 +65,13 @@ func RequestLogger(logger *logrus.Logger) gin.HandlerFunc { // Additional fields for debugging if debug { fields["raw_query"] = c.Request.URL.RawQuery + + err := c.Request.ParseForm() + if err == nil { + for k, v := range c.Request.Form { + fields["form_"+k] = strings.Join(v, ",") + } + } } entry := logger.WithFields(fields) diff --git a/pkg/api/middleware.go b/pkg/api/middleware.go index be79ec1..83a33ad 100644 --- a/pkg/api/middleware.go +++ b/pkg/api/middleware.go @@ -1,7 +1,6 @@ package api import ( - "log" "strings" "github.com/gin-gonic/gin" @@ -49,14 +48,6 @@ func dbCheckMiddleware() gin.HandlerFunc { } } -// Middleware to print out request parameters and body for debugging -func requestInspectMiddleware() gin.HandlerFunc { - return func(c *gin.Context) { - err := c.Request.ParseForm() - log.Println("Request params:", err, c.Request.Form) - } -} - // Middleware to inject CORS headers func corsMiddleware() gin.HandlerFunc { return func(c *gin.Context) { diff --git a/pkg/api/routes.go b/pkg/api/routes.go index 3f94f5f..9a83314 100644 --- a/pkg/api/routes.go +++ b/pkg/api/routes.go @@ -7,10 +7,6 @@ import ( ) func SetupMiddlewares(group *gin.RouterGroup) { - if command.Opts.Debug { - group.Use(requestInspectMiddleware()) - } - if command.Opts.Cors { group.Use(corsMiddleware()) } From 66fbc730feca82ee023d2162e48a74b1765b3418 Mon Sep 17 00:00:00 2001 From: Dan Sosedoff Date: Tue, 6 Dec 2022 12:30:43 -0600 Subject: [PATCH 4/4] Only include form for non-get requests --- pkg/api/logger.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/pkg/api/logger.go b/pkg/api/logger.go index 04a57e1..230d45b 100644 --- a/pkg/api/logger.go +++ b/pkg/api/logger.go @@ -66,11 +66,8 @@ func RequestLogger(logger *logrus.Logger) gin.HandlerFunc { if debug { fields["raw_query"] = c.Request.URL.RawQuery - err := c.Request.ParseForm() - if err == nil { - for k, v := range c.Request.Form { - fields["form_"+k] = strings.Join(v, ",") - } + if c.Request.Method != http.MethodGet { + fields["raw_form"] = c.Request.Form } }