From f2204149710e02b4037d43a724165cd80e5b1583 Mon Sep 17 00:00:00 2001 From: Sebastian Webber Date: Fri, 6 Feb 2026 01:46:46 -0300 Subject: [PATCH] feat: add jsonlog support for pgbadger configuration Add support for PostgreSQL's jsonlog format in pgbadger configuration, with automatic selection as default for PostgreSQL 15 and later versions. The jsonlog format provides structured JSON logging which is better suited for modern log analysis tools. Changes include: - Add jsonlog option to log configuration formats - Auto-select jsonlog as default for PostgreSQL >= 15 - Maintain backward compatibility with older versions (stderr default) - Update API and CLI documentation to reflect new option - Allow explicit format override via query parameter or flag Signed-off-by: Sebastian Webber --- cmd/api/handlers/v1/config.go | 10 ++++++++-- cmd/pgconfigctl/cmd/tune.go | 7 ++++++- pkg/category/log_config.go | 7 +++++++ 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/cmd/api/handlers/v1/config.go b/cmd/api/handlers/v1/config.go index bb9da03..7efe623 100644 --- a/cmd/api/handlers/v1/config.go +++ b/cmd/api/handlers/v1/config.go @@ -73,7 +73,7 @@ func LoadConfig(rulesFile, docsFile string) error { // @Param format query string false "Output format" Enums(json,alter_system,conf) default(json) // @Param show_doc query string false "Show Documentation args" Enums(true,false) default(false) // @Param include_pgbadger query string false "Add pgbadger configuration" Enums(true,false) default(false) -// @Param log_format query string false "Defines the log_format to be used" Enums(stderr,csvlog,syslog) default(stderr) +// @Param log_format query string false "Defines the log_format to be used (default: jsonlog for PG>=15, stderr otherwise)" Enums(stderr,csvlog,syslog,jsonlog) // @Success 200 {object} ResponseHTTP{} // @Router /v1/tuning/get-config [get] func GetConfig(c *fiber.Ctx) error { @@ -172,6 +172,12 @@ func parseConfigArgs(c *fiber.Ctx) (*configArgs, error) { return nil, fmt.Errorf("could not parse total ram: %w", err) } + // Set default log format based on PostgreSQL version + defaultLogFormat := "stderr" + if float32(pgVersion) >= 15.0 { + defaultLogFormat = "jsonlog" + } + return &configArgs{ pgVersion: float32(pgVersion), totalRAM: parsedRAM, @@ -184,7 +190,7 @@ func parseConfigArgs(c *fiber.Ctx) (*configArgs, error) { outFormat: format.ExportFormat(c.Query("format", "json")), showDoc: c.Query("show_doc", "false") == "true", includePgbadger: c.Query("include_pgbadger", "false") == "true", - logFormat: c.Query("log_format", "stderr"), + logFormat: c.Query("log_format", defaultLogFormat), }, nil } diff --git a/cmd/pgconfigctl/cmd/tune.go b/cmd/pgconfigctl/cmd/tune.go index 36c7ae2..b3a2548 100644 --- a/cmd/pgconfigctl/cmd/tune.go +++ b/cmd/pgconfigctl/cmd/tune.go @@ -59,6 +59,11 @@ var tuneCmd = &cobra.Command{ Long: `Uses your server info to compute the PostgreSQL tuning aiming to give you a get-start to tune your server.`, Run: func(cmd *cobra.Command, args []string) { + // Auto-select jsonlog for PostgreSQL 15+ if user didn't explicitly set log format + if !cmd.Flags().Changed("log-format") && pgVersion >= 15.0 { + logFormat = "jsonlog" + } + out, err := rules.Compute( *input.NewInput( osName, @@ -101,7 +106,7 @@ func init() { tuneCmd.PersistentFlags().MarkDeprecated("env-name", "please use --profile instead") tuneCmd.PersistentFlags().IntVarP(&maxConnections, "max-connections", "M", 100, "Max expected connections") tuneCmd.PersistentFlags().BoolVarP(&includePgbadger, "include-pgbadger", "B", false, "Include pgbadger params?") - tuneCmd.PersistentFlags().StringVarP(&logFormat, "log-format", "L", "csvlog", "Default log format") + tuneCmd.PersistentFlags().StringVarP(&logFormat, "log-format", "L", "csvlog", "Default log format (stderr, csvlog, syslog, jsonlog)") tuneCmd.PersistentFlags().VarP(&totalRAM, "ram", "", "Total Memory in bytes") tuneCmd.PersistentFlags().Lookup("ram").DefValue = totalRAM.String() diff --git a/pkg/category/log_config.go b/pkg/category/log_config.go index 4c2a124..f46c5c0 100644 --- a/pkg/category/log_config.go +++ b/pkg/category/log_config.go @@ -45,5 +45,12 @@ var ( {Format: "string", Name: "log_destination", Value: "csvlog"}, }, }, + "jsonlog": { + Name: "jsonlog_config", + Description: "JSON Log Configuration", + Parameters: []ParamSliceOutput{ + {Format: "string", Name: "log_destination", Value: "jsonlog"}, + }, + }, } )