Logging Parameter Values

Started by Volkan YAZICIalmost 18 years ago6 messagesgeneral
Jump to latest
#1Volkan YAZICI
yazicivo@ttmail.com

Hi,

While log_statements logs parameter values with the logged queries, I
cannot see parameter values logged for erronous queries and queries
catched by log_min_duration_statements.

Here are our logging settings:

# grep ^log postgresql.conf
logging_collector = on # Enable capturing of stderr and csvlog
log_directory = '/srv/pg/pg_log' # directory where log files are written,
log_filename = '%Y-%m-%d_%H%M%S.log' # log file name pattern,
log_rotation_age = 7d # Automatic rotation of logfiles will
log_rotation_size = 0MB # Automatic rotation of logfiles will
log_min_duration_statement = 1000 # -1 is disabled, 0 logs all statements
log_line_prefix = '%d %u %m ' # special values:

For instance, consider below log snippets.

eray_1_5_1_0 emove 2008-06-19 10:19:50.124 EEST ERROR: function isnull(integer, integer) does not exist at character 195
eray_1_5_1_0 emove 2008-06-19 10:19:50.124 EEST HINT: No function matches the given name and argument types. You might need to add explicit type casts.
eray_1_5_1_0 emove 2008-06-19 10:19:50.124 EEST STATEMENT: SELECT * FROM mugroup g WHERE g.groupid IN ((... user id=$1) UNION (SELECT ...))

test_1_5_0_0 emove 2008-05-15 15:07:08.631 EEST LOG: duration: 68544.986 ms parse <unnamed>: insert into interprettimelog (...) values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16)

Is this something expected? What might I be missing? How can I make
PostgreSQL log parameter values also?

Regards.

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Volkan YAZICI (#1)
Re: Logging Parameter Values

Volkan YAZICI <yazicivo@ttmail.com> writes:

While log_statements logs parameter values with the logged queries, I
cannot see parameter values logged for erronous queries and queries
catched by log_min_duration_statements.

What PG version are you using? Since 8.2 log_duration should show
parameter values. As for the other, you'd have to turn on
log_statements so that the parameters get logged in advance of the
failure. Once the transaction has failed we can't call user-defined
output functions, since they might try to do things that don't work
inside a failed transaction.

regards, tom lane

#3Volkan YAZICI
yazicivo@ttmail.com
In reply to: Tom Lane (#2)
Re: Logging Parameter Values

On Thu, 19 Jun 2008, Tom Lane <tgl@sss.pgh.pa.us> writes:

What PG version are you using? Since 8.2 log_duration should show
parameter values.

I don't want to interrupt your work, but as far as I see from logs --
with the configurations I sent previously -- PostgreSQL doesn't log
parameter values for queries dropped into query duration limit. (Using
PostgreSQL 8.3.1.) Consider this test case:

test# PREPARE foo (int) AS
] SELECT S.i * T.i
] FROM generate_series(1, $1) AS S(i),
] generate_series(1, $1) AS T(i);

test# EXECUTE foo (1000);
...

# tail -n 2 /srv/pg/pg_log/2008-06-19_141725.log
migration_test postgres 2008-06-19 17:58:05.185 EEST LOG: duration: 2315.420 ms statement: EXECUTE foo(1000);
migration_test postgres 2008-06-19 17:58:05.185 EEST DETAIL: prepare: PREPARE foo (int) AS SELECT S.i * T.i FROM generate_series(1, $1) AS S(i), generate_series(1, $1) AS T(i);

As for the other, you'd have to turn on log_statements so that the
parameters get logged in advance of the failure. Once the transaction
has failed we can't call user-defined output functions, since they
might try to do things that don't work inside a failed transaction.

I see.

Regards.

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Volkan YAZICI (#3)
Re: Logging Parameter Values

Volkan YAZICI <yazicivo@ttmail.com> writes:

PostgreSQL 8.3.1.) Consider this test case:

test# PREPARE foo (int) AS
] SELECT S.i * T.i
] FROM generate_series(1, $1) AS S(i),
] generate_series(1, $1) AS T(i);

test# EXECUTE foo (1000);
...

# tail -n 2 /srv/pg/pg_log/2008-06-19_141725.log
migration_test postgres 2008-06-19 17:58:05.185 EEST LOG: duration: 2315.420 ms statement: EXECUTE foo(1000);
migration_test postgres 2008-06-19 17:58:05.185 EEST DETAIL: prepare: PREPARE foo (int) AS SELECT S.i * T.i FROM generate_series(1, $1) AS S(i), generate_series(1, $1) AS T(i);

Hmm, we're not on the same page here. I thought you were talking about
protocol-level parameters. In the above example, the parameter values
are shown in the EXECUTE statement, so what else do you need?

regards, tom lane

#5Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Volkan YAZICI (#3)
Re: Logging Parameter Values

Volkan YAZICI wrote:

I don't want to interrupt your work, but as far as I see from logs --
with the configurations I sent previously -- PostgreSQL doesn't log
parameter values for queries dropped into query duration limit. (Using
PostgreSQL 8.3.1.) Consider this test case:

test# PREPARE foo (int) AS
] SELECT S.i * T.i
] FROM generate_series(1, $1) AS S(i),
] generate_series(1, $1) AS T(i);

test# EXECUTE foo (1000);
...

# tail -n 2 /srv/pg/pg_log/2008-06-19_141725.log
migration_test postgres 2008-06-19 17:58:05.185 EEST LOG: duration: 2315.420 ms statement: EXECUTE foo(1000);

The parameter is on the above line, isn't it?

migration_test postgres 2008-06-19 17:58:05.185 EEST DETAIL: prepare: PREPARE foo (int) AS SELECT S.i * T.i FROM generate_series(1, $1) AS S(i), generate_series(1, $1) AS T(i);

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

#6Volkan YAZICI
yazicivo@ttmail.com
In reply to: Tom Lane (#4)
Re: Logging Parameter Values

On Thu, 19 Jun 2008, Tom Lane <tgl@sss.pgh.pa.us> writes:

Volkan YAZICI <yazicivo@ttmail.com> writes:

# tail -n 2 /srv/pg/pg_log/2008-06-19_141725.log
migration_test postgres 2008-06-19 17:58:05.185 EEST LOG: duration: 2315.420 ms statement: EXECUTE foo(1000);
migration_test postgres 2008-06-19 17:58:05.185 EEST DETAIL: prepare: PREPARE foo (int) AS SELECT S.i * T.i FROM generate_series(1, $1) AS S(i), generate_series(1, $1) AS T(i);

Hmm, we're not on the same page here. I thought you were talking about
protocol-level parameters. In the above example, the parameter values
are shown in the EXECUTE statement, so what else do you need?

Umm... Bogus test case.

CL-USER> (postmodern:connect-toplevel
"migration_test" "postgres" nil "192.168.1.160")
; No value
CL-USER> (and (postmoder:query
(concatenate 'string
"SELECT S.i * T.*"
" FROM generate_series(1, $1) AS S (i),"
" generate_series(1, $2) AS T (i)")
1000 1000)
nil)
NIL

# tail /srv/pg/pg_log/2008-06-19_141725.log -n 2
migration_test postgres 2008-06-20 09:02:33.695 EEST LOG: duration: 4419.475 ms execute <unnamed>: SELECT S.i * T.* FROM generate_series(1, $1) AS S (i), generate_series(1, $2) AS T (i)
migration_test postgres 2008-06-20 09:02:33.695 EEST DETAIL: parameters: $1 = '1000', $2 = '1000'

Hrm... Now what might have caused the logged statements with missing
parameter values I pasted. I was probably looking at past log files
belongs to some other logging configuration.

Excuse me for the noise. And thanks for the prompt reply.

Regards.