On Mon, 12 Feb 2024 at 14:27, Jelte Fennema-Nio <m...@jeltef.nl> wrote: > Would a backtrace_functions_level GUC that would default to ERROR be > acceptable in this case?
I implemented it this way in the attached patchset.
From 71e2c1f1fa903ecfce4a79ff5981d0d754d134a2 Mon Sep 17 00:00:00 2001 From: Jelte Fennema-Nio <jelte.fenn...@microsoft.com> Date: Wed, 20 Dec 2023 11:41:18 +0100 Subject: [PATCH v3 2/2] Add wildcard support to backtrace_functions GUC With this change setting backtrace_functions to '*' will start logging backtraces for all errors (or more precisely all logs). --- doc/src/sgml/config.sgml | 5 +++++ src/backend/utils/error/elog.c | 8 +++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index ba5dbf9f096..a59d8e1b263 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -11136,6 +11136,11 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir' code. </para> + <para> + A single <literal>*</literal> character is interpreted as a wildcard and + will cause all errors in the log to contain backtraces. + </para> + <para> Backtrace support is not available on all platforms, and the quality of the backtraces depends on compilation options. diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index 8364125f44a..923e00e766e 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -843,6 +843,8 @@ matches_backtrace_functions(const char *funcname) if (*p == '\0') /* end of backtrace_function_list */ break; + if (strcmp("*", p) == 0) + return true; if (strcmp(funcname, p) == 0) return true; p += strlen(p) + 1; @@ -2135,14 +2137,14 @@ check_backtrace_functions(char **newval, void **extra, GucSource source) int j; /* - * Allow characters that can be C identifiers and commas as separators, as - * well as some whitespace for readability. + * Allow characters that can be C identifiers, commas as separators, the + * wildcard symbol, as well as some whitespace for readability. */ validlen = strspn(*newval, "0123456789_" "abcdefghijklmnopqrstuvwxyz" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - ", \n\t"); + ",* \n\t"); if (validlen != newvallen) { GUC_check_errdetail("Invalid character"); -- 2.34.1
From 4ffbc6b51a711bd266f15c02611d894b080a3e11 Mon Sep 17 00:00:00 2001 From: Jelte Fennema-Nio <jelte.fenn...@microsoft.com> Date: Tue, 27 Feb 2024 17:31:24 +0100 Subject: [PATCH v3 1/2] Add backtrace_functions_min_level Before this change a stacktrace would be attached to all logs messages in a function that matched backtrace_functions. But in most cases people only care about the stacktraces for messages with an ERROR level. This changes that default to only log stacktraces for ERROR messages but keeps the option open of logging stacktraces for different log levels too by having users configure the new backtrace_functions_min_level GUC. --- doc/src/sgml/config.sgml | 37 +++++++++++++++++++++++++---- src/backend/utils/error/elog.c | 1 + src/backend/utils/misc/guc_tables.c | 12 ++++++++++ src/include/utils/guc.h | 1 + 4 files changed, 47 insertions(+), 4 deletions(-) diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 36a2a5ce431..ba5dbf9f096 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -11128,10 +11128,12 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir' <listitem> <para> This parameter contains a comma-separated list of C function names. - If an error is raised and the name of the internal C function where - the error happens matches a value in the list, then a backtrace is - written to the server log together with the error message. This can - be used to debug specific areas of the source code. + If a log entry is raised with a level higher than + <xref linkend="guc-backtrace-functions-min-level"/> and the name of the + internal C function where the error happens matches a value in the + list, then a backtrace is written to the server log together with the + error message. This can be used to debug specific areas of the source + code. </para> <para> @@ -11146,6 +11148,33 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir' </listitem> </varlistentry> + <varlistentry id="guc-backtrace-functions-min-level" xreflabel="backtrace_functions_min_level"> + <term><varname>backtrace_functions_min_level</varname> (<type>string</type>) + <indexterm> + <primary><varname>backtrace_functions_min_level</varname> configuration parameter</primary> + </indexterm> + </term> + <listitem> + <para> + Controls which <link linkend="runtime-config-severity-levels">message + levels</link> cause stack traces to be written to the log, for log + entries in C functions that match the configured + <xref linkend="guc-backtrace-functions"/>. + </para> + + <para> + Backtrace support is not available on all platforms, and the quality + of the backtraces depends on compilation options. + </para> + + <para> + Only superusers and users with the appropriate <literal>SET</literal> + privilege can change this setting. + </para> + </listitem> + </varlistentry> + + <varlistentry id="guc-backtrace-on-internal-error" xreflabel="backtrace_on_internal_error"> <term><varname>backtrace_on_internal_error</varname> (<type>boolean</type>) <indexterm> diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index bba00a0087f..8364125f44a 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -500,6 +500,7 @@ errfinish(const char *filename, int lineno, const char *funcname) if (!edata->backtrace && ((edata->funcname && backtrace_functions && + edata->elevel >= backtrace_functions_min_level && matches_backtrace_functions(edata->funcname)) || (edata->sqlerrcode == ERRCODE_INTERNAL_ERROR && backtrace_on_internal_error))) diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c index 527a2b27340..20cedc208e7 100644 --- a/src/backend/utils/misc/guc_tables.c +++ b/src/backend/utils/misc/guc_tables.c @@ -529,6 +529,7 @@ double log_statement_sample_rate = 1.0; double log_xact_sample_rate = 0; char *backtrace_functions; bool backtrace_on_internal_error = false; +int backtrace_functions_min_level = ERROR; int temp_file_limit = -1; @@ -4658,6 +4659,17 @@ struct config_enum ConfigureNamesEnum[] = NULL, NULL, NULL }, + { + {"backtrace_functions_min_level", PGC_SUSET, DEVELOPER_OPTIONS, + gettext_noop("Sets the message levels that create backtraces when backtrace_functions is configured"), + NULL, + GUC_NOT_IN_SAMPLE + }, + &backtrace_functions_min_level, + ERROR, client_message_level_options, + NULL, NULL, NULL + }, + { {"bytea_output", PGC_USERSET, CLIENT_CONN_STATEMENT, gettext_noop("Sets the output format for bytea."), diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h index 471d53da8f0..69d5cb7a125 100644 --- a/src/include/utils/guc.h +++ b/src/include/utils/guc.h @@ -267,6 +267,7 @@ extern PGDLLIMPORT double log_statement_sample_rate; extern PGDLLIMPORT double log_xact_sample_rate; extern PGDLLIMPORT char *backtrace_functions; extern PGDLLIMPORT bool backtrace_on_internal_error; +extern PGDLLIMPORT int backtrace_functions_min_level; extern PGDLLIMPORT int temp_file_limit; base-commit: 92d2ab7554f92b841ea71bcc72eaa8ab11aae662 -- 2.34.1