diff options
Diffstat (limited to 'src/backend/utils/error/elog.c')
-rw-r--r-- | src/backend/utils/error/elog.c | 148 |
1 files changed, 82 insertions, 66 deletions
diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index d466a48d2d7..69e6fd52dbe 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/error/elog.c,v 1.92 2002/03/02 21:39:33 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/error/elog.c,v 1.93 2002/03/04 01:46:03 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -38,15 +38,13 @@ #include "mb/pg_wchar.h" #endif -#define DEFAULT_SERVER_MIN_MESSAGES_STR "notice" int server_min_messages; char *server_min_messages_str = NULL; -const char server_min_messages_str_default[] = DEFAULT_SERVER_MIN_MESSAGES_STR; +const char server_min_messages_str_default[] = "notice"; -#define DEFAULT_CLIENT_MIN_MESSAGES_STR "info" int client_min_messages; char *client_min_messages_str = NULL; -const char client_min_messages_str_default[] = DEFAULT_CLIENT_MIN_MESSAGES_STR; +const char client_min_messages_str_default[] = "info"; #ifdef ENABLE_SYSLOG /* @@ -106,7 +104,6 @@ void elog(int lev, const char *fmt,...) { va_list ap; - /* * The expanded format and final output message are dynamically * allocated if necessary, but not if they fit in the "reasonable @@ -128,59 +125,20 @@ elog(int lev, const char *fmt,...) char msg_fixedbuf[256]; char *fmt_buf = fmt_fixedbuf; char *msg_buf = msg_fixedbuf; - - /* for COPY line numbers */ - char copylineno_buf[32]; - + char copylineno_buf[32]; /* for COPY line numbers */ const char *errorstr; const char *prefix; const char *cp; char *bp; size_t space_needed; + size_t timestamp_size; /* prefix len for timestamp+pid */ bool output_to_server = false; bool output_to_client = false; - /* size of the prefix needed for timestamp and pid, if enabled */ - size_t timestamp_size; - /* Check for old elog calls. Codes were renumbered in 7.3. 2002-02-24 */ if (lev < DEBUG5) elog(FATAL, "Pre-7.3 object file made an elog() call. Recompile."); - if (Use_syslog <= 1 || whereToSendOutput == Debug) - { - if (lev == LOG) - { - if (server_min_messages == LOG) - output_to_server = true; - else if (server_min_messages < FATAL) - output_to_server = true; - } - /* lev != LOG */ - else - { - if (server_min_messages == LOG) - { - if (lev >= FATAL) - output_to_server = true; - } - /* Neither is LOG */ - else if (lev >= server_min_messages) - output_to_server = true; - } - } - - if (lev >= client_min_messages && whereToSendOutput == Remote) - output_to_client = true; - - /* optimization to prevent work for messages that would never be output */ - if (lev < ERROR && Use_syslog < 1 && - output_to_server == false && output_to_client == false) - return; - - /* Save error str before calling any function that might change errno */ - errorstr = useful_strerror(errno); - /* * Convert initialization errors into fatal errors. This is probably * redundant, because Warn_restart_ready won't be set anyway. @@ -192,12 +150,60 @@ elog(int lev, const char *fmt,...) * If we are inside a critical section, all errors become PANIC * errors. See miscadmin.h. */ - if (lev == ERROR || lev == FATAL) + if (lev >= ERROR) { if (CritSectionCount > 0) lev = PANIC; } + /* Determine whether message is enabled for server log output */ + /* Complicated because LOG is sorted out-of-order for this purpose */ + if (lev == LOG || lev == COMMERROR) + { + if (server_min_messages == LOG) + output_to_server = true; + else if (server_min_messages < FATAL) + output_to_server = true; + } + else + { + /* lev != LOG */ + if (server_min_messages == LOG) + { + if (lev >= FATAL) + output_to_server = true; + } + /* Neither is LOG */ + else if (lev >= server_min_messages) + output_to_server = true; + } + + /* Determine whether message is enabled for client output */ + if (whereToSendOutput == Remote && lev != COMMERROR) + { + /* + * client_min_messages is honored only after we complete the + * authentication handshake. This is required both for security + * reasons and because many clients can't handle NOTICE messages + * during authentication. + */ + if (ClientAuthInProgress) + output_to_client = (lev >= ERROR); + else + output_to_client = (lev >= client_min_messages); + } + + /* Skip formatting effort if non-error message will not be output */ + if (lev < ERROR && !output_to_server && !output_to_client) + return; + + /* Save error str before calling any function that might change errno */ + errorstr = useful_strerror(errno); + + /* Internationalize the error format string */ + fmt = gettext(fmt); + + /* Begin formatting by determining prefix information */ prefix = elog_message_prefix(lev); timestamp_size = 0; @@ -206,8 +212,6 @@ elog(int lev, const char *fmt,...) if (Log_pid) timestamp_size += PID_SIZE; - fmt = gettext(fmt); - /* * Set up the expanded format, consisting of the prefix string plus * input format, with any %m replaced by strerror() string (since @@ -221,7 +225,7 @@ elog(int lev, const char *fmt,...) { /* * Prints the failure line of the COPY. Wow, what a hack! bjm - * Translators: Error message will be truncated at 31 characters. + * Translator: Error message will be truncated at 31 characters. */ snprintf(copylineno_buf, 32, gettext("copy: line %d, "), copy_lineno); space_needed += strlen(copylineno_buf); @@ -234,7 +238,7 @@ elog(int lev, const char *fmt,...) { /* We're up against it, convert to out-of-memory error */ fmt_buf = fmt_fixedbuf; - if (lev != FATAL && lev != PANIC) + if (lev < ERROR) { lev = ERROR; prefix = elog_message_prefix(lev); @@ -263,7 +267,7 @@ elog(int lev, const char *fmt,...) if (copy_lineno) { strcat(fmt_buf, copylineno_buf); - if (lev == ERROR || lev == FATAL || lev == PANIC) + if (lev >= ERROR) copy_lineno = 0; } @@ -331,7 +335,7 @@ elog(int lev, const char *fmt,...) { /* We're up against it, convert to out-of-memory error */ msg_buf = msg_fixedbuf; - if (lev != FATAL && lev != PANIC) + if (lev < ERROR) { lev = ERROR; prefix = elog_message_prefix(lev); @@ -353,7 +357,7 @@ elog(int lev, const char *fmt,...) #ifdef ENABLE_SYSLOG /* Write to syslog, if enabled */ - if (Use_syslog >= 1) + if (output_to_server && Use_syslog >= 1) { int syslog_level; @@ -367,6 +371,7 @@ elog(int lev, const char *fmt,...) syslog_level = LOG_DEBUG; break; case LOG: + case COMMERROR: case INFO: syslog_level = LOG_INFO; break; @@ -392,11 +397,11 @@ elog(int lev, const char *fmt,...) /* syslog doesn't want a trailing newline, but other destinations do */ strcat(msg_buf, "\n"); - /* Write to server logs or server terminal */ - if (output_to_server) + /* Write to stderr, if enabled */ + if (output_to_server && (Use_syslog <= 1 || whereToSendOutput == Debug)) write(2, msg_buf, strlen(msg_buf)); - /* Should we output to the client too? */ + /* Send to client, if enabled */ if (output_to_client) { /* Send IPC message to the front-end program */ @@ -442,6 +447,13 @@ elog(int lev, const char *fmt,...) ImmediateInterruptOK = false; /* + * If we just reported a startup failure, the client will + * disconnect on receiving it, so don't send any more to the client. + */ + if (!Warn_restart_ready && whereToSendOutput == Remote) + whereToSendOutput = None; + + /* * For a FATAL error, we let proc_exit clean up and exit. * * If we have not yet entered the main backend loop (ie, we are in @@ -482,7 +494,7 @@ elog(int lev, const char *fmt,...) siglongjmp(Warn_restart, 1); } - if (lev == FATAL || lev == PANIC) + if (lev == PANIC) { /* * Serious crash time. Postmaster will observe nonzero process @@ -494,7 +506,7 @@ elog(int lev, const char *fmt,...) ImmediateInterruptOK = false; fflush(stdout); fflush(stderr); - proc_exit(lev); + proc_exit(2); } /* We reach here if lev <= NOTICE. OK to return to caller. */ @@ -774,7 +786,8 @@ useful_strerror(int errnum) * translator: This string will be truncated at 47 characters * expanded. */ - snprintf(errorstr_buf, 48, gettext("operating system error %d"), errnum); + snprintf(errorstr_buf, 48, gettext("operating system error %d"), + errnum); str = errorstr_buf; } @@ -798,6 +811,7 @@ elog_message_prefix(int lev) prefix = gettext("DEBUG: "); break; case LOG: + case COMMERROR: prefix = gettext("LOG: "); break; case INFO: @@ -832,7 +846,7 @@ check_server_min_messages(const char *lev) if (strcasecmp(lev, "debug") == 0 || strcasecmp(lev, "debug1") == 0 || strcasecmp(lev, "debug2") == 0 || - strcasecmp(lev, "debub3") == 0 || + strcasecmp(lev, "debug3") == 0 || strcasecmp(lev, "debug4") == 0 || strcasecmp(lev, "debug5") == 0 || strcasecmp(lev, "log") == 0 || @@ -848,7 +862,9 @@ check_server_min_messages(const char *lev) void assign_server_min_messages(const char *lev) { - if (strcasecmp(lev, "debug1") == 0) + if (strcasecmp(lev, "debug") == 0) + server_min_messages = DEBUG1; + else if (strcasecmp(lev, "debug1") == 0) server_min_messages = DEBUG1; else if (strcasecmp(lev, "debug2") == 0) server_min_messages = DEBUG2; @@ -895,7 +911,9 @@ check_client_min_messages(const char *lev) void assign_client_min_messages(const char *lev) { - if (strcasecmp(lev, "debug1") == 0) + if (strcasecmp(lev, "debug") == 0) + client_min_messages = DEBUG1; + else if (strcasecmp(lev, "debug1") == 0) client_min_messages = DEBUG1; else if (strcasecmp(lev, "debug2") == 0) client_min_messages = DEBUG2; @@ -917,5 +935,3 @@ assign_client_min_messages(const char *lev) /* Can't get here unless guc.c screwed up */ elog(ERROR, "bogus client_min_messages %s", lev); } - - |