提交 61c3e5b2 编写于 作者: T Tom Lane

Make log_min_error_statement put LOG level at the same priority as

log_min_messages does; and arrange to suppress the duplicative output
that would otherwise result from log_statement and log_duration messages.
Bruce Momjian and Tom Lane.
上级 1a7f6302
<!-- $PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.112 2007/02/16 16:37:29 tgl Exp $ -->
<!-- $PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.113 2007/03/02 23:37:22 tgl Exp $ -->
<chapter Id="runtime-config">
<title>Server Configuration</title>
......@@ -2507,9 +2507,10 @@ SELECT * FROM parent WHERE key = 2400;
<literal>DEBUG2</literal>, <literal>DEBUG1</literal>,
<literal>INFO</literal>, <literal>NOTICE</literal>,
<literal>WARNING</literal>, <literal>ERROR</literal>,
<literal>LOG</literal>,
<literal>FATAL</literal>, and <literal>PANIC</literal>.
The default is <literal>ERROR</literal>, which means statements
causing errors, fatal errors, or panics will be logged.
causing errors, log messages, fatal errors, or panics will be logged.
To effectively turn off logging of failing statements,
set this parameter to <literal>PANIC</literal>.
Only superusers can change this setting.
......
<!-- $PostgreSQL: pgsql/doc/src/sgml/sources.sgml,v 2.27 2007/02/01 22:06:14 tgl Exp $ -->
<!-- $PostgreSQL: pgsql/doc/src/sgml/sources.sgml,v 2.28 2007/03/02 23:37:22 tgl Exp $ -->
<chapter id="source">
<title>PostgreSQL Coding Conventions</title>
......@@ -206,6 +206,14 @@ ereport(ERROR,
socket-related system call.
</para>
</listitem>
<listitem>
<para>
<function>errhidestmt(bool hide_stmt)</function> can be called to specify
suppression of the <literal>STATEMENT:</> portion of a message in the
postmaster log. Generally this is appropriate if the message text
includes the current statement already.
</para>
</listitem>
</itemizedlist>
</para>
......
......@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.525 2007/02/20 17:32:16 tgl Exp $
* $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.526 2007/03/02 23:37:22 tgl Exp $
*
* NOTES
* this is the "main" module of the postgres backend and
......@@ -823,6 +823,7 @@ exec_simple_query(const char *query_string)
{
ereport(LOG,
(errmsg("statement: %s", query_string),
errhidestmt(true),
errdetail_execute(parsetree_list)));
was_logged = true;
}
......@@ -1020,12 +1021,14 @@ exec_simple_query(const char *query_string)
{
case 1:
ereport(LOG,
(errmsg("duration: %s ms", msec_str)));
(errmsg("duration: %s ms", msec_str),
errhidestmt(true)));
break;
case 2:
ereport(LOG,
(errmsg("duration: %s ms statement: %s",
msec_str, query_string),
errhidestmt(true),
errdetail_execute(parsetree_list)));
break;
}
......@@ -1281,14 +1284,16 @@ exec_parse_message(const char *query_string, /* string to execute */
{
case 1:
ereport(LOG,
(errmsg("duration: %s ms", msec_str)));
(errmsg("duration: %s ms", msec_str),
errhidestmt(true)));
break;
case 2:
ereport(LOG,
(errmsg("duration: %s ms parse %s: %s",
msec_str,
*stmt_name ? stmt_name : "<unnamed>",
query_string)));
query_string),
errhidestmt(true)));
break;
}
......@@ -1635,7 +1640,8 @@ exec_bind_message(StringInfo input_message)
{
case 1:
ereport(LOG,
(errmsg("duration: %s ms", msec_str)));
(errmsg("duration: %s ms", msec_str),
errhidestmt(true)));
break;
case 2:
ereport(LOG,
......@@ -1645,6 +1651,7 @@ exec_bind_message(StringInfo input_message)
*portal_name ? "/" : "",
*portal_name ? portal_name : "",
pstmt->query_string ? pstmt->query_string : "<source not stored>"),
errhidestmt(true),
errdetail_params(params)));
break;
}
......@@ -1778,6 +1785,7 @@ exec_execute_message(const char *portal_name, long max_rows)
*portal_name ? portal_name : "",
sourceText ? ": " : "",
sourceText ? sourceText : ""),
errhidestmt(true),
errdetail_params(portalParams)));
was_logged = true;
}
......@@ -1846,7 +1854,8 @@ exec_execute_message(const char *portal_name, long max_rows)
{
case 1:
ereport(LOG,
(errmsg("duration: %s ms", msec_str)));
(errmsg("duration: %s ms", msec_str),
errhidestmt(true)));
break;
case 2:
ereport(LOG,
......@@ -1860,6 +1869,7 @@ exec_execute_message(const char *portal_name, long max_rows)
*portal_name ? portal_name : "",
sourceText ? ": " : "",
sourceText ? sourceText : ""),
errhidestmt(true),
errdetail_params(portalParams)));
break;
}
......
......@@ -42,7 +42,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.182 2007/02/11 11:59:26 mha Exp $
* $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.183 2007/03/02 23:37:23 tgl Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -731,6 +731,25 @@ errcontext(const char *fmt,...)
}
/*
* errhidestmt --- optionally suppress STATEMENT: field of log entry
*
* This should be called if the message text already includes the statement.
*/
int
errhidestmt(bool hide_stmt)
{
ErrorData *edata = &errordata[errordata_stack_depth];
/* we don't bother incrementing recursion_depth */
CHECK_STACK_DEPTH();
edata->hide_stmt = hide_stmt;
return 0; /* return value does not matter */
}
/*
* errfunction --- add reporting function name to the current error
*
......@@ -1629,7 +1648,9 @@ send_message_to_server_log(ErrorData *edata)
/*
* If the user wants the query that generated this error logged, do it.
*/
if (edata->elevel >= log_min_error_statement && debug_query_string != NULL)
if (is_log_level_output(edata->elevel, log_min_error_statement) &&
debug_query_string != NULL &&
!edata->hide_stmt)
{
log_line_prefix(&buf);
appendStringInfoString(&buf, _("STATEMENT: "));
......@@ -2046,7 +2067,7 @@ write_stderr(const char *fmt,...)
vsnprintf(errbuf, sizeof(errbuf), fmt, ap);
write_eventlog(EVENTLOG_ERROR_TYPE, errbuf);
write_eventlog(ERROR, errbuf);
}
else
/* Not running as service, write to stderr */
......@@ -2055,13 +2076,18 @@ write_stderr(const char *fmt,...)
va_end(ap);
}
/*
* is_log_level_output -- is elevel logically >= log_min_level?
*
* We use this for tests that should consider LOG to sort out-of-order,
* between ERROR and FATAL. Generally this is the right thing for testing
* whether a message should go to the postmaster log, whereas a simple >=
* test is correct for testing whether the message should go to the client.
*/
static bool
is_log_level_output(int elevel, int log_min_level)
{
/*
* Complicated because LOG is sorted out-of-order here, between
* ERROR and FATAL.
*/
if (elevel == LOG || elevel == COMMERROR)
{
if (log_min_level == LOG || log_min_level <= ERROR)
......
......@@ -262,7 +262,7 @@
# - When to Log -
#client_min_messages = notice # Values, in order of decreasing detail:
#client_min_messages = notice # Values in order of decreasing detail:
# debug5
# debug4
# debug3
......@@ -273,7 +273,7 @@
# warning
# error
#log_min_messages = notice # Values, in order of decreasing detail:
#log_min_messages = notice # Values in order of decreasing detail:
# debug5
# debug4
# debug3
......@@ -289,7 +289,7 @@
#log_error_verbosity = default # terse, default, or verbose messages
#log_min_error_statement = error # Values in order of increasing severity:
#log_min_error_statement = error # Values in order of decreasing detail:
# debug5
# debug4
# debug3
......@@ -299,11 +299,14 @@
# notice
# warning
# error
# log
# fatal
# panic (effectively off)
#log_min_duration_statement = -1 # -1 is disabled, 0 logs all statements
# and their durations.
# and their durations, > 0 logs only
# statements running at least N msec.
#silent_mode = off # DO NOT USE without syslog or
# redirect_stderr
......
......@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $PostgreSQL: pgsql/src/include/utils/elog.h,v 1.83 2007/01/05 22:19:59 momjian Exp $
* $PostgreSQL: pgsql/src/include/utils/elog.h,v 1.84 2007/03/02 23:37:23 tgl Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -137,6 +137,8 @@ errcontext(const char *fmt,...)
the supplied arguments. */
__attribute__((format(printf, 1, 2)));
extern int errhidestmt(bool hide_stmt);
extern int errfunction(const char *funcname);
extern int errposition(int cursorpos);
......@@ -240,6 +242,7 @@ typedef struct ErrorData
bool output_to_server; /* will report to server log? */
bool output_to_client; /* will report to client? */
bool show_funcname; /* true to force funcname inclusion */
bool hide_stmt; /* true to prevent STATEMENT: inclusion */
const char *filename; /* __FILE__ of ereport() call */
int lineno; /* __LINE__ of ereport() call */
const char *funcname; /* __func__ of ereport() call */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册