Logging question

Started by Madison Kellyabout 21 years ago13 messagesgeneral
Jump to latest
#1Madison Kelly
linux@alteeve.com

Hi all,

This is probably an easy question but I couldn't my answer in the
docs (I probably looked right at it...).

Is there any way I can log and/or display database calls for a
specific database? I am trying to debug a third party program and I can
see that the problem probably has something to do with the DB call (and
insert statement). I normally would use a print inside the program to
see what is being called but this program uses DB calls in a way I am
not familiar with. If could see what is actually being sent it would
make my life a lot easier.

I don't want to just enable logging though because there is another
quite active database on the same system.

Thanks!!

Madison

#2Michael Fuhr
mike@fuhr.org
In reply to: Madison Kelly (#1)
Re: Logging question

On Mon, Jan 17, 2005 at 09:03:17PM -0500, Madison Kelly wrote:

Is there any way I can log and/or display database calls for a
specific database?

I don't know of a way to enable logging for a specific database,
but you can enable logging for a specific user or session. For
example, you could cause johndoe's statements to be logged by doing
one of the following:

ALTER USER johndoe SET log_statement TO TRUE; -- 7.x
ALTER USER johndoe SET log_statement TO 'all'; -- 8.0

All new connections that johndoe makes will now have statement
logging enabled.

To enable logging for a particular session, execute the appropriate
"SET log_statement" statement in that session. If you have permission
problems then you could wrap that operation in a function defined
as SECURITY DEFINER and create the function as a database superuser.

--
Michael Fuhr
http://www.fuhr.org/~mfuhr/

#3Paul Tillotson
pntil@shentel.net
In reply to: Madison Kelly (#1)
Re: Logging question

Madison Kelly wrote:

Hi all,

This is probably an easy question but I couldn't my answer in the
docs (I probably looked right at it...).

Is there any way I can log and/or display database calls for a
specific database? I am trying to debug a third party program and I
can see that the problem probably has something to do with the DB call
(and insert statement). I normally would use a print inside the
program to see what is being called but this program uses DB calls in
a way I am not familiar with. If could see what is actually being sent
it would make my life a lot easier.

http://www.ethereal.com/

I use ethereal (on the client--although it would possibly work on the
server too) in such a case. It's a bit messy but if you just want to
see what SQL statements were being run, then it works. I also saw some
where that the new version of ethereal has a dissector for Postgres,
which would presumably show you the communication between the client and
server in a nicely-formatted way.

Paul Tillotson

#4Tony Caduto
tony.caduto@amsoftwaredesign.com
In reply to: Michael Fuhr (#2)
Re: Logging question

Michael,
This is great info, is there a way to get the log back via a SQL call?
It would be pretty cool if there was a way to have the log go to a table
instead of a file.

Tony Caduto

Michael Fuhr wrote:

Show quoted text

ALTER USER johndoe SET log_statement TO TRUE; -- 7.x
ALTER USER johndoe SET log_statement TO 'all'; -- 8.0

All new connections that johndoe makes will now have statement
logging enabled.

To enable logging for a particular session, execute the appropriate
"SET log_statement" statement in that session. If you have permission
problems then you could wrap that operation in a function defined
as SECURITY DEFINER and create the function as a database superuser.

#5Michael Fuhr
mike@fuhr.org
In reply to: Paul Tillotson (#3)
Re: Logging question

On Mon, Jan 17, 2005 at 10:06:20PM -0500, Paul Tillotson wrote:

I use ethereal (on the client--although it would possibly work on the
server too) in such a case. It's a bit messy but if you just want to
see what SQL statements were being run, then it works.

Caveats: sniffers like ethereal or tcpdump won't work over connections
that use local (Unix domain) sockets, and SSL connections might be
problematic.

I also saw some where that the new version of ethereal has a dissector
for Postgres, which would presumably show you the communication
between the client and server in a nicely-formatted way.

Ethereal 0.10.8 appears to have a PostgreSQL dissector:

Request "create table foo (x integer);
Response CREATE TABLE
Request insert into foo values (1);
Response INSERT 0 1
Request insert into foo values (2);
Response INSERT 0 1
Request insert into foo values (3);
Response INSERT 0 1
Request select * from foo;
Response 1D 2D 3C SELECT

--
Michael Fuhr
http://www.fuhr.org/~mfuhr/

#6Michael Fuhr
mike@fuhr.org
In reply to: Tony Caduto (#4)
Re: Logging question

On Mon, Jan 17, 2005 at 09:13:19PM -0600, Tony Caduto wrote:

This is great info, is there a way to get the log back via a SQL call?
It would be pretty cool if there was a way to have the log go to a table
instead of a file.

Not that I'm aware of, but you could write a function to read the
log file if you know where it is. That would be easy in a language
like PL/Python or PL/Perl.

--
Michael Fuhr
http://www.fuhr.org/~mfuhr/

#7Tom Lane
tgl@sss.pgh.pa.us
In reply to: Michael Fuhr (#2)
Re: Logging question

Michael Fuhr <mike@fuhr.org> writes:

On Mon, Jan 17, 2005 at 09:03:17PM -0500, Madison Kelly wrote:

Is there any way I can log and/or display database calls for a
specific database?

I don't know of a way to enable logging for a specific database,
but you can enable logging for a specific user or session.

ALTER USER johndoe SET log_statement TO TRUE; -- 7.x

You forgot that ALTER DATABASE has this same option. It might be that
ALTER USER is just as convenient, or even more so, for Madison's problem
... but it *can* be set at the database scope if needed.

regards, tom lane

#8Madison Kelly
linux@alteeve.com
In reply to: Tom Lane (#7)
Re: Logging question

Tom Lane wrote:

Michael Fuhr <mike@fuhr.org> writes:

On Mon, Jan 17, 2005 at 09:03:17PM -0500, Madison Kelly wrote:

Is there any way I can log and/or display database calls for a
specific database?

I don't know of a way to enable logging for a specific database,
but you can enable logging for a specific user or session.

ALTER USER johndoe SET log_statement TO TRUE; -- 7.x

You forgot that ALTER DATABASE has this same option. It might be that
ALTER USER is just as convenient, or even more so, for Madison's problem
... but it *can* be set at the database scope if needed.

regards, tom lane

Can I ask a horribly embarrising question?

Where /is/ the log file? I've looked in the config file, in the init
file, in /var/log, on google... no luck! ^.^;

Madison

#9Tom Lane
tgl@sss.pgh.pa.us
In reply to: Madison Kelly (#8)
Re: Logging question

Madison Kelly <linux@alteeve.com> writes:

Where /is/ the log file?

It depends. If you selected syslog logging then it's wherever syslog is
configured to put the messages. Otherwise, it's wherever the
postmaster's stderr output is being sent.

A fairly annoying property of the current RPM packagings is that their
startup script sends postmaster stderr to /dev/null. We have (finally)
fixed that for 8.0, but in current releases you need to alter the
startup script in order to get useful log output.

regards, tom lane

#10Michael Fuhr
mike@fuhr.org
In reply to: Tom Lane (#7)
Re: Logging question

On Mon, Jan 17, 2005 at 11:41:34PM -0500, Tom Lane wrote:

You forgot that ALTER DATABASE has this same option. It might be that
ALTER USER is just as convenient, or even more so, for Madison's problem
... but it *can* be set at the database scope if needed.

Drat, thanks for the reminder. And yep, there it is, right at the
top of the ALTER DATABASE documentation...that's what I get for not
checking.

--
Michael Fuhr
http://www.fuhr.org/~mfuhr/

#11Michael Glaesemann
grzm@seespotcode.net
In reply to: Michael Fuhr (#10)
Re: Logging question

On Jan 18, 2005, at 13:57, Michael Fuhr wrote:

On Mon, Jan 17, 2005 at 11:41:34PM -0500, Tom Lane wrote:

You forgot that ALTER DATABASE has this same option. It might be that
ALTER USER is just as convenient, or even more so, for Madison's
problem
... but it *can* be set at the database scope if needed.

Drat, thanks for the reminder. And yep, there it is, right at the
top of the ALTER DATABASE documentation...that's what I get for not
checking.

Michael,

Just for the record, I'd like to state that I've been incredibly
impressed with your fast response time and depth and accuracy of
answers. You're a machine :) I've been learning a lot lurking.

Thanks!

Michael Glaesemann
grzm myrealbox com

#12Madison Kelly
linux@alteeve.com
In reply to: Tom Lane (#9)
Re: Logging question

Tom Lane wrote:

Madison Kelly <linux@alteeve.com> writes:

Where /is/ the log file?

It depends. If you selected syslog logging then it's wherever syslog is
configured to put the messages. Otherwise, it's wherever the
postmaster's stderr output is being sent.

A fairly annoying property of the current RPM packagings is that their
startup script sends postmaster stderr to /dev/null. We have (finally)
fixed that for 8.0, but in current releases you need to alter the
startup script in order to get useful log output.

regards, tom lane

woohoo!!

Thank you, I would have taken forever to figure that out on my own...
For the record on Fedora Core 1 the line to change is:

'/etc/rc.d/rc3.d/s85postgresql' line 171

Which I changed from:

su -l postgres -s /bin/sh -c "/usr/bin/pg_ctl -D $PGDATA -p
/usr/bin/postmaster -o '-p ${PGPORT}' start > /dev/null 2>&1" < $

to...

su -l postgres -s /bin/sh -c "/usr/bin/pg_ctl -D $PGDATA -p
/usr/bin/postmaster -o '-p ${PGPORT}' start > /var/log/psql.log $#

I had to touch the 'psql.log' file and then 'chown' it to
'postgres:postgres' but now my queries are being logged. Adding the earlier:

ALTER USER johndoe SET log_statement TO TRUE;

that Michael Fuhr mentioned and I have exactly what I wanted happening.
Thank you all -very- much!

Madison

#13Lonni J Friedman
netllama@gmail.com
In reply to: Madison Kelly (#8)
Re: Logging question

On Mon, 17 Jan 2005 23:44:37 -0500, Madison Kelly <linux@alteeve.com> wrote:

Tom Lane wrote:

Michael Fuhr <mike@fuhr.org> writes:

On Mon, Jan 17, 2005 at 09:03:17PM -0500, Madison Kelly wrote:

Is there any way I can log and/or display database calls for a
specific database?

I don't know of a way to enable logging for a specific database,
but you can enable logging for a specific user or session.

ALTER USER johndoe SET log_statement TO TRUE; -- 7.x

You forgot that ALTER DATABASE has this same option. It might be that
ALTER USER is just as convenient, or even more so, for Madison's problem
... but it *can* be set at the database scope if needed.

regards, tom lane

Can I ask a horribly embarrising question?

Where /is/ the log file? I've looked in the config file, in the init
file, in /var/log, on google... no luck! ^.^;

In the 'official' 7.4.x RPMs look for the PGLOG variable in
/etc/init.d/postgresql and set that to where you want to generate the
log.

--
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
L. Friedman netllama@gmail.com
LlamaLand http://netllama.linux-sxs.org