<para>
Causes the duration of each completed statement to be logged
if the statement ran for at least the specified number of
- milliseconds. Setting this to zero prints all statement durations.
- Minus-one (the default) disables logging statement durations.
- For example, if you set it to <literal>250ms</literal>
- then all SQL statements that run 250ms or longer will be
- logged. Enabling this parameter can be helpful in tracking down
+ milliseconds, modulated by <varname>log_statement_sample_rate</varname>.
+ Setting this to zero prints all statement durations. Minus-one (the default)
+ disables logging statement durations. For example, if you set it to
+ <literal>250ms</literal> then all SQL statements that run 250ms or longer
+ will be logged. Enabling this parameter can be helpful in tracking down
unoptimized queries in your applications.
Only superusers can change this setting.
</para>
</listitem>
</varlistentry>
+ <varlistentry id="guc-log-statement-sample-rate" xreflabel="log_statement_sample_rate">
+ <term><varname>log_statement_sample_rate</varname> (<type>real</type>)
+ <indexterm>
+ <primary><varname>log_statement_sample_rate</varname> configuration parameter</primary>
+ </indexterm>
+ </term>
+ <listitem>
+ <para>
+ Determines the fraction of the statements that exceed
+ <xref linkend="guc-log-min-duration-statement"/> which to log.
+ The default is <literal>1</literal>, meaning log to all such
+ statements.
+ Setting this to zero disables logging, same as setting
+ <varname>log_min_duration_statement</varname>
+ to minus-one. <varname>log_statement_sample_rate</varname>
+ is helpful when the traffic is too high to log all queries.
+ </para>
+ </listitem>
+ </varlistentry>
+
</variablelist>
<para>
/*
* check_log_duration
- * Determine whether current command's duration should be logged
+ * Determine whether current command's duration should be logged.
+ * If log_statement_sample_rate < 1.0, log only a sample.
*
* Returns:
* 0 if no logging is needed
int usecs;
int msecs;
bool exceeded;
+ bool in_sample;
TimestampDifference(GetCurrentStatementStartTimestamp(),
GetCurrentTimestamp(),
(secs > log_min_duration_statement / 1000 ||
secs * 1000 + msecs >= log_min_duration_statement)));
- if (exceeded || log_duration)
+ /*
+ * Do not log if log_statement_sample_rate = 0. Log a sample if
+ * log_statement_sample_rate <= 1 and avoid unecessary random() call
+ * if log_statement_sample_rate = 1.
+ */
+ if (exceeded)
+ in_sample = log_statement_sample_rate != 0 &&
+ (log_statement_sample_rate == 1 ||
+ random() <= log_statement_sample_rate * MAX_RANDOM_VALUE);
+
+ if ((exceeded && in_sample) || log_duration)
{
snprintf(msec_str, 32, "%ld.%03d",
secs * 1000 + msecs, usecs % 1000);
int client_min_messages = NOTICE;
int log_min_duration_statement = -1;
int log_temp_files = -1;
+double log_statement_sample_rate = 1.0;
int trace_recovery_messages = LOG;
int temp_file_limit = -1;
{"log_min_duration_statement", PGC_SUSET, LOGGING_WHEN,
gettext_noop("Sets the minimum execution time above which "
"statements will be logged."),
- gettext_noop("Zero prints all queries. -1 turns this feature off."),
+ gettext_noop("Zero prints all queries, subject to log_statement_sample_rate. "
+ "-1 turns this feature off."),
GUC_UNIT_MS
},
&log_min_duration_statement,
NULL, NULL, NULL
},
+ {
+ {"log_statement_sample_rate", PGC_SUSET, LOGGING_WHEN,
+ gettext_noop("Fraction of statements over log_min_duration_statement to log."),
+ gettext_noop("If you only want a sample, use a value between 0 (never "
+ "log) and 1.0 (always log).")
+ },
+ &log_statement_sample_rate,
+ 1.0, 0.0, 1.0,
+ NULL, NULL, NULL
+ },
+
/* End-of-list marker */
{
{NULL, 0, 0, NULL, NULL}, NULL, 0.0, 0.0, 0.0, NULL, NULL, NULL
# fatal
# panic (effectively off)
-#log_min_duration_statement = -1 # -1 is disabled, 0 logs all statements
- # and their durations, > 0 logs only
- # statements running at least this number
- # of milliseconds
-
+#log_min_duration_statement = -1 # logs statements and their durations
+ # according to log_statement_sample_rate. -1 is disabled,
+ # 0 logs all statement, > 0 logs only statements running at
+ # least this number of milliseconds.
+
+#log_statement_sample_rate = 1 # Fraction of logged statements over
+ # log_min_duration_statement. 1.0 logs all statements,
+ # 0 never logs.
# - What to Log -
extern PGDLLIMPORT int client_min_messages;
extern int log_min_duration_statement;
extern int log_temp_files;
+extern double log_statement_sample_rate;
extern int temp_file_limit;