Logging question
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
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/
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.
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
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.0All 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.
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/
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/
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
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
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
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/
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
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
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