OSDN Git Service

Add GUC option log_error_verbosity to control which fields of error
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 30 Jun 2003 16:47:02 +0000 (16:47 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 30 Jun 2003 16:47:02 +0000 (16:47 +0000)
reports get put into the postmaster log.  Options are TERSE, DEFAULT,
VERBOSE, with the same behavior as implemented on the client side in
libpq.

doc/src/sgml/runtime.sgml
src/backend/utils/error/elog.c
src/backend/utils/misc/guc.c
src/backend/utils/misc/postgresql.conf.sample
src/bin/psql/tab-complete.c
src/include/utils/elog.h

index 2cc2400..3f6a2b3 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/runtime.sgml,v 1.188 2003/06/27 18:20:50 momjian Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/runtime.sgml,v 1.189 2003/06/30 16:47:01 tgl Exp $
 -->
 
 <Chapter Id="runtime">
@@ -1513,7 +1513,7 @@ SET ENABLE_SEQSCAN TO OFF;
      <title>When To Log</title>
 
        <para>
-        Here is a list of the various message types:
+        Here is a list of the various message severity levels:
         <variablelist>
          <varlistentry>
           <term><literal>DEBUG[1-5]</literal></term>
@@ -1597,11 +1597,28 @@ SET ENABLE_SEQSCAN TO OFF;
      <variablelist>
 
      <varlistentry>
+      <term><varname>CLIENT_MIN_MESSAGES</varname> (<type>string</type>)</term>
+      <listitem>
+       <para>
+        Controls which message levels are sent to the client.
+        Valid values are <literal>DEBUG5</>,
+        <literal>DEBUG4</>, <literal>DEBUG3</>, <literal>DEBUG2</>,
+        <literal>DEBUG1</>, <literal>LOG</>, <literal>NOTICE</>,
+        <literal>WARNING</>, and <literal>ERROR</>.  Each level
+        includes all the levels that follow it.  The later the level,
+        the fewer messages are sent.  The default is
+        <literal>NOTICE</>.  Note that <literal>LOG</> has a different
+        rank here than in <literal>LOG_MIN_MESSAGES</>.
+       </para>
+      </listitem>
+     </varlistentry>
+
+     <varlistentry>
       <term><varname>LOG_MIN_MESSAGES</varname> (<type>string</type>)</term>
       <listitem>
        <para>
-        This controls which message levels are written to the server
-        log.  Valid values are <literal>DEBUG5</>, <literal>DEBUG4</>,
+        Controls which message levels are written to the server log.
+       Valid values are <literal>DEBUG5</>, <literal>DEBUG4</>,
         <literal>DEBUG3</>, <literal>DEBUG2</>, <literal>DEBUG1</>,
         <literal>INFO</>, <literal>NOTICE</>, <literal>WARNING</>,
         <literal>ERROR</>, <literal>LOG</>, <literal>FATAL</>, and
@@ -1609,30 +1626,22 @@ SET ENABLE_SEQSCAN TO OFF;
         follow it.  The later the level, the fewer messages are sent
         to the log.  The default is <literal>NOTICE</>.  Note that
         <literal>LOG</> has a different rank here than in
-        <literal>CLIENT_MIN_MESSAGES</>.  Also see that section for an
-        explanation of the various values.
+        <literal>CLIENT_MIN_MESSAGES</>.
        </para>
-
       </listitem>
      </varlistentry>
 
      <varlistentry>
-      <term><varname>CLIENT_MIN_MESSAGES</varname> (<type>string</type>)</term>
+      <term><varname>LOG_ERROR_VERBOSITY</varname> (<type>string</type>)</term>
       <listitem>
        <para>
-        This controls which message levels are send to the client.
-        client.  Valid values are <literal>DEBUG5</>,
-        <literal>DEBUG4</>, <literal>DEBUG3</>, <literal>DEBUG2</>,
-        <literal>DEBUG1</>, <literal>LOG</>, <literal>NOTICE</>,
-        <literal>WARNING</>, and <literal>ERROR</>.  Each level
-        includes all the levels that follow it.  The later the level,
-        the fewer messages are sent.  The default is
-        <literal>NOTICE</>.  Note that <literal>LOG</> has a different
-        rank here than in <literal>LOG_MIN_MESSAGES</>.
+        Controls the amount of detail written in the server log for each
+       message that is logged.  Valid values are <literal>TERSE</>,
+       <literal>DEFAULT</>, and <literal>VERBOSE</>, each adding more
+       fields to displayed messages.
        </para>
       </listitem>
      </varlistentry>
-     
 
      <varlistentry>
       <term><varname>LOG_MIN_ERROR_STATEMENT</varname> (<type>string</type>)</term>
@@ -1643,7 +1652,7 @@ SET ENABLE_SEQSCAN TO OFF;
         statements that cause an error of the specified level, or a
         higher level, are logged.  The default is
         <literal>PANIC</literal> (effectively turning this feature
-        off). Valid values are <literal>DEBUG5</literal>,
+        off for normal use). Valid values are <literal>DEBUG5</literal>,
         <literal>DEBUG4</literal>, <literal>DEBUG3</literal>,
         <literal>DEBUG2</literal>, <literal>DEBUG1</literal>,
         <literal>INFO</literal>, <literal>NOTICE</literal>,
@@ -1654,12 +1663,6 @@ SET ENABLE_SEQSCAN TO OFF;
         logged. Enabling this option can be helpful in tracking down
         the source of any errors that appear in the server log.
        </para>
-
-       <para>
-        It is recommended you enable <varname>LOG_PID</varname> as well
-        so you can more easily match the error statement with the error
-        message.
-       </para>
       </listitem>
      </varlistentry>
      
@@ -1668,12 +1671,12 @@ SET ENABLE_SEQSCAN TO OFF;
        <listitem>
         <para>
          Sets a minimum statement execution time (in milliseconds)
-         above which a statement will be logged.  All SQL statements
+         above which a statement will be logged.  All SQL statements
          that run longer than the time specified will be logged together
-         with the duration, in seconds.  The default is <literal>0</literal>
-         (turning this feature off).  For example, if you set it
+         with their actual duration.  Setting this to zero (the default)
+        disables time-based logging.  For example, if you set it
          to <literal>250</literal> then all SQL statements that run longer
-         than 250ms will be logged along with the duration.  Enabling this
+         than 250ms will be logged.  Enabling this
          option can be useful in tracking down unoptimized queries in
          your applications.
         </para>
@@ -1688,8 +1691,8 @@ SET ENABLE_SEQSCAN TO OFF;
         will automatically run in background and any controlling terminals
         are disassociated.  Thus, no messages are written to standard
         output or standard error (same effect as <command>postmaster</>'s <option>-S</option>
-        option). Unless some logging system such as
-        <application>syslog</> is enabled, using this option is
+        option). Unless
+        <application>syslog</> logging is enabled, using this option is
         discouraged since it makes it impossible to see error messages.
        </para>
       </listitem>
index 9d371a5..0660aaa 100644 (file)
@@ -37,7 +37,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/error/elog.c,v 1.111 2003/05/28 18:19:09 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/error/elog.c,v 1.112 2003/06/30 16:47:01 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -68,6 +68,7 @@
 ErrorContextCallback *error_context_stack = NULL;
 
 /* GUC parameters */
+PGErrorVerbosity Log_error_verbosity = PGERROR_VERBOSE;
 bool           Log_timestamp;          /* show timestamps in stderr output */
 bool           Log_pid;                        /* show PIDs in stderr output */
 
@@ -918,23 +919,52 @@ send_message_to_server_log(ErrorData *edata)
 
        appendStringInfo(&buf, "%s:  ", error_severity(edata->elevel));
 
+       if (Log_error_verbosity >= PGERROR_VERBOSE)
+       {
+               /* unpack MAKE_SQLSTATE code */
+               char    tbuf[12];
+               int             ssval;
+               int             i;
+
+               ssval = edata->sqlerrcode;
+               for (i = 0; i < 5; i++)
+               {
+                       tbuf[i] = PGUNSIXBIT(ssval);
+                       ssval >>= 6;
+               }
+               tbuf[i] = '\0';
+               appendStringInfo(&buf, "%s: ", tbuf);
+       }
+
        if (edata->message)
-               appendStringInfo(&buf, "%s\n", edata->message);
+               appendStringInfoString(&buf, edata->message);
        else
-               appendStringInfoString(&buf, "missing error text\n");
+               appendStringInfoString(&buf, gettext("missing error text"));
 
-       /* XXX showing of additional info should perhaps be optional */
-       /* XXX ought to localize the label strings, probably */
+       if (edata->cursorpos > 0)
+               appendStringInfo(&buf, gettext(" at character %d"), edata->cursorpos);
 
-       if (edata->detail)
-               appendStringInfo(&buf, "DETAIL:  %s\n", edata->detail);
-       if (edata->hint)
-               appendStringInfo(&buf, "HINT:  %s\n", edata->hint);
-       if (edata->context)
-               appendStringInfo(&buf, "CONTEXT:  %s\n", edata->context);
-       if (edata->funcname && edata->filename)
-               appendStringInfo(&buf, "IN:  %s (%s:%d)\n",
-                                                edata->funcname, edata->filename, edata->lineno);
+       appendStringInfoChar(&buf, '\n');
+
+       if (Log_error_verbosity >= PGERROR_DEFAULT)
+       {
+               if (edata->detail)
+                       appendStringInfo(&buf, gettext("DETAIL:  %s\n"), edata->detail);
+               if (edata->hint)
+                       appendStringInfo(&buf, gettext("HINT:  %s\n"), edata->hint);
+               if (edata->context)
+                       appendStringInfo(&buf, gettext("CONTEXT:  %s\n"), edata->context);
+               if (Log_error_verbosity >= PGERROR_VERBOSE)
+               {
+                       if (edata->funcname && edata->filename)
+                               appendStringInfo(&buf, gettext("LOCATION:  %s, %s:%d\n"),
+                                                                edata->funcname, edata->filename,
+                                                                edata->lineno);
+                       else if (edata->filename)
+                               appendStringInfo(&buf, gettext("LOCATION:  %s:%d\n"),
+                                                                edata->filename, edata->lineno);
+               }
+       }
 
        /*
         * If the user wants the query that generated this error logged, do so.
@@ -942,7 +972,8 @@ send_message_to_server_log(ErrorData *edata)
         * for queries triggered by extended query protocol; how to improve?
         */
        if (edata->elevel >= log_min_error_statement && debug_query_string != NULL)
-               appendStringInfo(&buf, "STATEMENT:  %s\n", debug_query_string);
+               appendStringInfo(&buf, gettext("STATEMENT:  %s\n"),
+                                                debug_query_string);
 
 
 #ifdef HAVE_SYSLOG
@@ -992,11 +1023,10 @@ send_message_to_server_log(ErrorData *edata)
                 * Timestamp and PID are only used for stderr output --- we assume
                 * the syslog daemon will supply them for us in the other case.
                 */
-               if (Log_timestamp)
-                       fprintf(stderr, "%s", print_timestamp());
-               if (Log_pid)
-                       fprintf(stderr, "%s", print_pid());
-               fprintf(stderr, "%s", buf.data);
+               fprintf(stderr, "%s%s%s",
+                               Log_timestamp ? print_timestamp() : "",
+                               Log_pid ? print_pid() : "",
+                               buf.data);
        }
 
        pfree(buf.data);
index dfdc4f8..6e0da5b 100644 (file)
@@ -10,7 +10,7 @@
  * Written by Peter Eisentraut <peter_e@gmx.net>.
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.132 2003/06/27 19:08:38 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.133 2003/06/30 16:47:01 tgl Exp $
  *
  *--------------------------------------------------------------------
  */
@@ -94,6 +94,8 @@ static const char *assign_min_error_statement(const char *newval, bool doit,
                                                   bool interactive);
 static const char *assign_msglvl(int *var, const char *newval,
                          bool doit, bool interactive);
+static const char *assign_log_error_verbosity(const char *newval, bool doit,
+                                                                                         bool interactive);
 static bool assign_phony_autocommit(bool newval, bool doit, bool interactive);
 
 
@@ -134,9 +136,10 @@ int                        client_min_messages = NOTICE;
  * cases provide the value for SHOW to display.  The real state is elsewhere
  * and is kept in sync by assign_hooks.
  */
-static char *log_min_error_statement_str;
-static char *log_min_messages_str;
 static char *client_min_messages_str;
+static char *log_min_messages_str;
+static char *log_error_verbosity_str;
+static char *log_min_error_statement_str;
 static bool phony_autocommit;
 static bool session_auth_is_superuser;
 static double phony_random_seed;
@@ -821,6 +824,16 @@ static struct config_string
        },
 
        {
+               {"log_min_messages", PGC_SUSET}, &log_min_messages_str,
+               "notice", assign_log_min_messages, NULL
+       },
+
+       {
+               {"log_error_verbosity", PGC_SUSET}, &log_error_verbosity_str,
+               "default", assign_log_error_verbosity, NULL
+       },
+
+       {
                {"log_min_error_statement", PGC_SUSET}, &log_min_error_statement_str,
                "panic", assign_min_error_statement, NULL
        },
@@ -909,11 +922,6 @@ static struct config_string
                PG_VERSION, NULL, NULL
        },
 
-       {
-               {"log_min_messages", PGC_SUSET}, &log_min_messages_str,
-               "notice", assign_log_min_messages, NULL
-       },
-
        /* Not for general use --- used by SET SESSION AUTHORIZATION */
        {
                {"session_authorization", PGC_USERSET, GUC_NO_SHOW_ALL | GUC_NO_RESET_ALL},
@@ -3468,6 +3476,29 @@ assign_msglvl(int *var, const char *newval, bool doit, bool interactive)
        return newval;                          /* OK */
 }
 
+static const char *
+assign_log_error_verbosity(const char *newval, bool doit, bool interactive)
+{
+       if (strcasecmp(newval, "terse") == 0)
+       {
+               if (doit)
+                       Log_error_verbosity = PGERROR_TERSE;
+       }
+       else if (strcasecmp(newval, "default") == 0)
+       {
+               if (doit)
+                       Log_error_verbosity = PGERROR_DEFAULT;
+       }
+       else if (strcasecmp(newval, "verbose") == 0)
+       {
+               if (doit)
+                       Log_error_verbosity = PGERROR_VERBOSE;
+       }
+       else
+               return NULL;                    /* fail */
+       return newval;                          /* OK */
+}
+
 static bool
 assign_phony_autocommit(bool newval, bool doit, bool interactive)
 {
index 594c230..57c6e55 100644 (file)
 #
 #      Message display
 #
+#client_min_messages = notice  # Values, in order of decreasing detail:
+                               #   debug5, debug4, debug3, debug2, debug1,
+                               #   log, info, notice, warning, error
 #log_min_messages = notice     # Values, in order of decreasing detail:
                                #   debug5, debug4, debug3, debug2, debug1,
                                #   info, notice, warning, error, log, fatal,
                                #   panic
-#client_min_messages = notice  # Values, in order of decreasing detail:
-                               #   debug5, debug4, debug3, debug2, debug1,
-                               #   log, info, notice, warning, error
+
+#log_error_verbosity = default # terse, default, or verbose messages
+
 #silent_mode = false
 
 #log_connections = false
index f0de8f6..8f70c25 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright 2000-2002 by PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/tab-complete.c,v 1.80 2003/06/12 01:38:08 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/tab-complete.c,v 1.81 2003/06/30 16:47:01 tgl Exp $
  */
 
 /*----------------------------------------------------------------------
@@ -543,6 +543,7 @@ psql_completion(char *text, int start, int end)
                "lc_numeric",
                "lc_time",
                "log_duration",
+               "log_error_verbosity",
                "log_executor_stats",
                "log_min_duration_statement",
                "log_min_error_statement",
index f10a15d..b92bc83 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: elog.h,v 1.44 2003/05/27 17:49:46 momjian Exp $
+ * $Id: elog.h,v 1.45 2003/06/30 16:47:02 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -268,6 +268,15 @@ extern DLLIMPORT ErrorContextCallback *error_context_stack;
 
 
 /* GUC-configurable parameters */
+
+typedef enum
+{
+       PGERROR_TERSE,                          /* single-line error messages */
+       PGERROR_DEFAULT,                        /* recommended style */
+       PGERROR_VERBOSE                         /* all the facts, ma'am */
+} PGErrorVerbosity;
+
+extern PGErrorVerbosity Log_error_verbosity;
 extern bool Log_timestamp;
 extern bool Log_pid;
 #ifdef HAVE_SYSLOG