From d928c3e49593f3bf08def8a40c246d3aa8de46ac Mon Sep 17 00:00:00 2001 From: Jelte Fennema-Nio Date: Tue, 27 Feb 2024 17:31:24 +0100 Subject: [PATCH v4 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 | 46 ++++++++++++++++++++++++++--- src/backend/utils/error/elog.c | 1 + src/backend/utils/misc/guc_tables.c | 29 ++++++++++++++++++ src/include/utils/guc.h | 1 + 4 files changed, 73 insertions(+), 4 deletions(-) diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 43b1a132a2c..bc066284334 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -11267,10 +11267,12 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir' 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 equal to or higher than + 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. @@ -11285,6 +11287,42 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir' + + backtrace_functions_min_level (string) + + backtrace_functions_min_level configuration parameter + + + + + Controls which message + levels cause stack traces to be written to the log, for messages + raised from C functions that match the configured + . + Valid values are DEBUG5, DEBUG4, + DEBUG3, DEBUG2, DEBUG1, + LOG, INFO, NOTICE, + WARNING, ERROR, FATAL, + and PANIC. Each level includes all the levels that + follow it. The later the level, the fewer messages result in a + backtrace. The default is ERROR. Note that + LOG has a different rank here than in + . + + + + Backtrace support is not available on all platforms, and the quality + of the backtraces depends on compilation options. + + + + Only superusers and users with the appropriate SET + privilege can change this setting. + + + + + backtrace_on_internal_error (boolean) diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index c9719f358b6..699d9d0a241 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 93ded31ed92..94497e0174d 100644 --- a/src/backend/utils/misc/guc_tables.c +++ b/src/backend/utils/misc/guc_tables.c @@ -162,6 +162,23 @@ static const struct config_enum_entry server_message_level_options[] = { {NULL, 0, false} }; +static const struct config_enum_entry backtrace_functions_level_options[] = { + {"debug5", DEBUG5, false}, + {"debug4", DEBUG4, false}, + {"debug3", DEBUG3, false}, + {"debug2", DEBUG2, false}, + {"debug1", DEBUG1, false}, + {"debug", DEBUG2, true}, + {"log", LOG, false}, + {"info", INFO, true}, + {"notice", NOTICE, false}, + {"warning", WARNING, false}, + {"error", ERROR, false}, + {"fatal", FATAL, false}, + {"panic", PANIC, false}, + {NULL, 0, false} +}; + static const struct config_enum_entry intervalstyle_options[] = { {"postgres", INTSTYLE_POSTGRES, false}, {"postgres_verbose", INTSTYLE_POSTGRES_VERBOSE, false}, @@ -530,6 +547,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; @@ -4689,6 +4707,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, backtrace_functions_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: 53c2a97a92665be6bd7d70bd62ae6158fe4db96e -- 2.34.1