diff options
| author | Pavan Deolasee | 2016-02-11 10:31:14 +0000 |
|---|---|---|
| committer | Pavan Deolasee | 2016-10-18 09:57:46 +0000 |
| commit | 5c0182c86797487e4cc2837e5d3a0f28ea2d7293 (patch) | |
| tree | 191b5c758c38d493042ee763a8b87e31fb0a926c | |
| parent | 56c8520aee868cbb708d5869efab5eeae248d425 (diff) | |
Improve the debugging infrastructure by adding mechanism to dynamically
increase/decrease log levels
This new pg_msgmodule_change() function can be used to increment or decrement
compile time defined log levels by the given step. Of course, this is only
applicable to DEBUG1-5 and LOG messages and the resulting new level is also
within the same range. This only affects whats gets logged on the server log
and not what gets sent to the client
| -rw-r--r-- | src/backend/utils/error/elog.c | 186 | ||||
| -rw-r--r-- | src/include/catalog/pg_proc.h | 2 |
2 files changed, 126 insertions, 62 deletions
diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index d85a22e4f1..dabe5c2c60 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -2637,7 +2637,7 @@ log_line_prefix(StringInfo buf, ErrorData *edata) break; case 'S': - if (padding != NULL) + if (padding != 0) appendStringInfo(buf, "%*s", padding, global_session_string); else appendStringInfo(buf, "%s", global_session_string); @@ -3750,6 +3750,7 @@ static int get_overriden_log_level(int moduleid, int fileid, int msgid, int origlevel) { uint32 position; + int value, relative, change, elevel; /* * The shared memory may not set during init processing or in a stand alone @@ -3766,6 +3767,11 @@ get_overriden_log_level(int moduleid, int fileid, int msgid, int origlevel) (msgid <= 0 || msgid >= PGXL_MSG_MAX_MSGIDS_PER_FILE)) return origlevel; + if (origlevel < DEBUG5 || origlevel >= LOG) + return origlevel; + + elevel = origlevel; + /* * Get the overridden log level and return it back */ @@ -3773,7 +3779,28 @@ get_overriden_log_level(int moduleid, int fileid, int msgid, int origlevel) PGXL_MSG_MAX_MSGIDS_PER_FILE + (fileid - 1) * PGXL_MSG_MAX_MSGIDS_PER_FILE + (msgid - 1); - return MsgModuleCtl[position] ? MsgModuleCtl[position] : origlevel; + + /* Read once */ + value = MsgModuleCtl[position]; + + relative = value & 0x80; + change = value & 0x7f; + + if (value) + { + if (relative) + { + elevel = elevel + change; + if (elevel < DEBUG5) + elevel = DEBUG5; + else if (elevel >= LOG) + elevel = LOG; + } + else + elevel = change; + return elevel; + } + return origlevel; } #endif @@ -3794,20 +3821,6 @@ is_log_level_output(int elevel, #endif int log_min_level) { - if (elevel == LOG || elevel == COMMERROR) - { - if (log_min_level == LOG || log_min_level <= ERROR) - return true; - } - else if (log_min_level == LOG) - { - /* elevel != LOG */ - if (elevel >= FATAL) - return true; - } - /* Neither is LOG */ - else if (elevel >= log_min_level) - return true; #ifdef USE_MODULE_MSGIDS /* * Check if the message's compile time value has been changed during the @@ -3823,19 +3836,24 @@ is_log_level_output(int elevel, * especially be useful to turn some specific ERROR messages into FATAL or * PANIC to be able to get a core dump for analysis. */ - else + elevel = get_overriden_log_level(moduleid, fileid, msgid, + elevel); +#endif + + if (elevel == LOG || elevel == COMMERROR) { - int newlevel = get_overriden_log_level(moduleid, fileid, msgid, - elevel); - if (newlevel == LOG) - { - if (log_min_level == LOG || log_min_level <= ERROR) - return true; - } - else if (newlevel >= log_min_level) + if (log_min_level == LOG || log_min_level <= ERROR) return true; } -#endif + else if (log_min_level == LOG) + { + /* elevel != LOG */ + if (elevel >= FATAL) + return true; + } + /* Neither is LOG */ + else if (elevel >= log_min_level) + return true; return false; } @@ -3905,14 +3923,9 @@ MsgModuleShmemInit(void) &found); } -Datum -pg_msgmodule_set(PG_FUNCTION_ARGS) +static bool +pg_msgmodule_internal(int32 moduleid, int32 fileid, int32 msgid, char value) { - int32 moduleid = PG_GETARG_INT32(0); - int32 fileid = PG_GETARG_INT32(1); - int32 msgid = PG_GETARG_INT32(2); - const char *levelstr = PG_GETARG_CSTRING(3); - int32 level; uint32 start_position; uint32 len; @@ -3921,28 +3934,6 @@ pg_msgmodule_set(PG_FUNCTION_ARGS) (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), (errmsg("must be superuser to change elog message level")))); - /* - * The only accepted values for the log levels are - LOG, DEBUG[1-5] and - * DEFAULT - */ - if (strcasecmp(levelstr, "LOG") == 0) - level = LOG; - else if (strcasecmp(levelstr, "DEFAULT") == 0) - level = 0; - else if (strcasecmp(levelstr, "DEBUG1") == 0) - level = DEBUG1; - else if (strcasecmp(levelstr, "DEBUG2") == 0) - level = DEBUG2; - else if (strcasecmp(levelstr, "DEBUG3") == 0) - level = DEBUG3; - else if (strcasecmp(levelstr, "DEBUG4") == 0) - level = DEBUG4; - else if (strcasecmp(levelstr, "DEBUG5") == 0) - level = DEBUG5; - else - ereport(ERROR, - (errcode(ERRCODE_INTERNAL_ERROR), - (errmsg("Invalid value \"%s\" for log level", levelstr)))); if (moduleid <= 0 || moduleid >= PGXL_MSG_MAX_MODULES) ereport(ERROR, (errmsg_internal("Invalid module id %d, allowed values 1-%d", @@ -3956,8 +3947,8 @@ pg_msgmodule_set(PG_FUNCTION_ARGS) */ len = PGXL_MSG_MAX_FILEIDS_PER_MODULE * PGXL_MSG_MAX_MSGIDS_PER_FILE; start_position = (moduleid - 1) * len; - memset(MsgModuleCtl + start_position, level, len); - PG_RETURN_BOOL(true); + memset(MsgModuleCtl + start_position, value, len); + return true; } else { @@ -3974,8 +3965,8 @@ pg_msgmodule_set(PG_FUNCTION_ARGS) len = PGXL_MSG_MAX_MSGIDS_PER_FILE; start_position = ((moduleid - 1) * PGXL_MSG_MAX_FILEIDS_PER_MODULE * PGXL_MSG_MAX_MSGIDS_PER_FILE) + (fileid - 1) * PGXL_MSG_MAX_MSGIDS_PER_FILE; - memset(MsgModuleCtl + start_position, level, len); - PG_RETURN_BOOL(true); + memset(MsgModuleCtl + start_position, value, len); + return true; } if (msgid <= 0 || msgid >= PGXL_MSG_MAX_MSGIDS_PER_FILE) @@ -3989,10 +3980,75 @@ pg_msgmodule_set(PG_FUNCTION_ARGS) start_position = ((moduleid - 1) * PGXL_MSG_MAX_FILEIDS_PER_MODULE * PGXL_MSG_MAX_MSGIDS_PER_FILE) + ((fileid - 1) * PGXL_MSG_MAX_MSGIDS_PER_FILE) + (msgid - 1); - memset(MsgModuleCtl + start_position, level, len); - PG_RETURN_BOOL(true); + memset(MsgModuleCtl + start_position, value, len); + return true; } - PG_RETURN_BOOL(true); + return true; +} + +Datum +pg_msgmodule_set(PG_FUNCTION_ARGS) +{ + int32 moduleid = PG_GETARG_INT32(0); + int32 fileid = PG_GETARG_INT32(1); + int32 msgid = PG_GETARG_INT32(2); + const char *levelstr = PG_GETARG_CSTRING(3); + int32 level; + + if (!superuser()) + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + (errmsg("must be superuser to change elog message level")))); + + /* + * The only accepted values for the log levels are - LOG, DEBUG[1-5] and + * DEFAULT + */ + if (strcasecmp(levelstr, "LOG") == 0) + level = LOG; + else if (strcasecmp(levelstr, "DEFAULT") == 0) + level = 0; + else if (strcasecmp(levelstr, "DEBUG1") == 0) + level = DEBUG1; + else if (strcasecmp(levelstr, "DEBUG2") == 0) + level = DEBUG2; + else if (strcasecmp(levelstr, "DEBUG3") == 0) + level = DEBUG3; + else if (strcasecmp(levelstr, "DEBUG4") == 0) + level = DEBUG4; + else if (strcasecmp(levelstr, "DEBUG5") == 0) + level = DEBUG5; + else + ereport(ERROR, + (errcode(ERRCODE_INTERNAL_ERROR), + (errmsg("Invalid value \"%s\" for log level", levelstr)))); + + PG_RETURN_BOOL(pg_msgmodule_internal(moduleid, fileid, msgid, level)); +} + +Datum +pg_msgmodule_change(PG_FUNCTION_ARGS) +{ + int32 moduleid = PG_GETARG_INT32(0); + int32 fileid = PG_GETARG_INT32(1); + int32 msgid = PG_GETARG_INT32(2); + int32 change = PG_GETARG_INT32(3); + int level; + + if (!superuser()) + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + (errmsg("must be superuser to change elog message level")))); + + if ((change < (DEBUG5 - LOG)) || (change > (LOG - DEBUG5))) + ereport(ERROR, + (errcode(ERRCODE_INTERNAL_ERROR), + (errmsg("accepted values are between %d and +%d", DEBUG5 - LOG, LOG - + DEBUG5)))); + + level = 0x80 | change; + + PG_RETURN_BOOL(pg_msgmodule_internal(moduleid, fileid, msgid, level)); } #else Datum @@ -4001,4 +4057,10 @@ pg_msgmodule_set(PG_FUNCTION_ARGS) ereport(ERROR, (errmsg_internal("Module msgid support not available. " "Please recompile with --enable-genmsgids"))); } +Datum +pg_msgmodule_change(PG_FUNCTION_ARGS) +{ + ereport(ERROR, (errmsg_internal("Module msgid support not available. " + "Please recompile with --enable-genmsgids"))); +} #endif diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h index 8e0be6684a..69f87d77ff 100644 --- a/src/include/catalog/pg_proc.h +++ b/src/include/catalog/pg_proc.h @@ -5373,6 +5373,8 @@ DESCR("get progress for all replication origins"); #ifdef USE_MODULE_MSGIDS DATA(insert OID = 6015 ( pg_msgmodule_set PGNSP PGUID 12 1 1 0 0 f f f f t t i 4 0 16 "20 20 20 2275" _null_ _null_ _null_ _null_ _null_ pg_msgmodule_set _null_ _null_ _null_ )); DESCR("set debugging level for module/file/msg"); +DATA(insert OID = 6016 ( pg_msgmodule_change PGNSP PGUID 12 1 1 0 0 f f f f t t i 4 0 16 "20 20 20 20" _null_ _null_ _null_ _null_ _null_ pg_msgmodule_change _null_ _null_ _null_ )); +DESCR("change debugging level for module/file/msg"); #endif /* |
