Have log_duration only output when log_statement has printed the query.

This handles the new multiple log_statement values.

Ed L.
This commit is contained in:
Bruce Momjian 2004-10-15 16:50:31 +00:00
parent c96c02c7af
commit a1ce88a59c
2 changed files with 21 additions and 10 deletions

View File

@ -1,5 +1,5 @@
<!-- <!--
$PostgreSQL: pgsql/doc/src/sgml/runtime.sgml,v 1.287 2004/10/09 23:12:53 tgl Exp $ $PostgreSQL: pgsql/doc/src/sgml/runtime.sgml,v 1.288 2004/10/15 16:50:29 momjian Exp $
--> -->
<Chapter Id="runtime"> <Chapter Id="runtime">
@ -2355,13 +2355,14 @@ archive_command = 'copy "%p" /mnt/server/archivedir/"%f"' # Win32
<term><varname>log_duration</varname> (<type>boolean</type>)</term> <term><varname>log_duration</varname> (<type>boolean</type>)</term>
<listitem> <listitem>
<para> <para>
Causes the duration of every completed statement to be logged. Causes the duration of every completed statement which satisfies
To use this option, it is recommended that you also enable <varname>log_statement</> to be logged. When using this option,
<varname>log_statement</> and if not using <application>syslog</> if you are not using <application>syslog</>, it is recommended
log the PID using <varname>log_line_prefix</> so that you that you log the PID or session ID using <varname>log_line_prefix</>
can link the statement to the duration using the process or log the session ID so that you can link the statement to the
ID. The default is off. Only superusers can turn off this duration using the process ID or session ID. The default is off.
option if it is enabled by the administrator. Only superusers can turn off this option if it is enabled by the
administrator.
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.435 2004/10/12 21:54:40 petere Exp $ * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.436 2004/10/15 16:50:31 momjian Exp $
* *
* NOTES * NOTES
* this is the "main" module of the postgres backend and * this is the "main" module of the postgres backend and
@ -81,6 +81,9 @@ bool Log_disconnections = false;
LogStmtLevel log_statement = LOGSTMT_NONE; LogStmtLevel log_statement = LOGSTMT_NONE;
/* flag indicating if the statement satisfies log_statement */
bool statement_logged;
/* GUC variable for maximum stack depth (measured in kilobytes) */ /* GUC variable for maximum stack depth (measured in kilobytes) */
int max_stack_depth = 2048; int max_stack_depth = 2048;
@ -463,9 +466,13 @@ pg_parse_query(const char *query_string)
List *raw_parsetree_list; List *raw_parsetree_list;
ListCell *parsetree_item; ListCell *parsetree_item;
statement_logged = false;
if (log_statement == LOGSTMT_ALL) if (log_statement == LOGSTMT_ALL)
{
ereport(LOG, ereport(LOG,
(errmsg("statement: %s", query_string))); (errmsg("statement: %s", query_string)));
statement_logged = true;
}
if (log_parser_stats) if (log_parser_stats)
ResetUsage(); ResetUsage();
@ -501,6 +508,7 @@ pg_parse_query(const char *query_string)
{ {
ereport(LOG, ereport(LOG,
(errmsg("statement: %s", query_string))); (errmsg("statement: %s", query_string)));
statement_logged = true;
break; break;
} }
commandTag = CreateCommandTag(parsetree); commandTag = CreateCommandTag(parsetree);
@ -512,6 +520,7 @@ pg_parse_query(const char *query_string)
{ {
ereport(LOG, ereport(LOG,
(errmsg("statement: %s", query_string))); (errmsg("statement: %s", query_string)));
statement_logged = true;
break; break;
} }
} }
@ -1003,7 +1012,8 @@ exec_simple_query(const char *query_string)
} }
usecs = (long) (stop_t.tv_sec - start_t.tv_sec) * 1000000 + (long) (stop_t.tv_usec - start_t.tv_usec); usecs = (long) (stop_t.tv_sec - start_t.tv_sec) * 1000000 + (long) (stop_t.tv_usec - start_t.tv_usec);
if (save_log_duration) /* Only print duration if we previously printed the statement. */
if (statement_logged && save_log_duration)
ereport(LOG, ereport(LOG,
(errmsg("duration: %ld.%03ld ms", (errmsg("duration: %ld.%03ld ms",
(long) ((stop_t.tv_sec - start_t.tv_sec) * 1000 + (long) ((stop_t.tv_sec - start_t.tv_sec) * 1000 +