snippetsqlModerate
How to get notices to the output stream?
Viewed 0 times
streamthenoticesoutputgethow
Problem
I have debugging messages in functions. Those message are raised like
I set my log file with
Then I do what I need to do with
And when the execution is terminated,
The problem is that I don't have the messages raised by notices into messages.txt. The messages are displayed on the screen but I want them to be written in messages.txt
How could I do that ?
I tried to use
I have a work around with
but I would like to know how I could use \i and \o on plsql client having the messages into the file specified in \o
My client, on cygwin is psql (PostgreSQL) 8.2.11 and the server version is 9.0.7
RAISE NOTICE 'Value of id : %', id;I set my log file with
\o messages.txtThen I do what I need to do with
\i process.sqlAnd when the execution is terminated,
\o.The problem is that I don't have the messages raised by notices into messages.txt. The messages are displayed on the screen but I want them to be written in messages.txt
How could I do that ?
I tried to use
RAISE LOG... and messages are written in log file... It's not what I want.I have a work around with
plsql -f /path/to/process.sql > messages.txt 2>&1but I would like to know how I could use \i and \o on plsql client having the messages into the file specified in \o
My client, on cygwin is psql (PostgreSQL) 8.2.11 and the server version is 9.0.7
Solution
I'm afraid that you won't like this answer, but currently it seems impossible.
From the psql documentation:
Saves future query results to the file filename or pipes future
results into a separate Unix shell to execute command. If no arguments
are specified, the query output will be reset to the standard output.
"Query results" includes all tables, command responses, and notices
obtained from the database server, as well as output of various
backslash commands that query the database (such as \d), but not error
messages.
And as you noticed, there is no way redirecting error messages when using
(I've been playing around with all kinds of redirection from \o to no avail. It looks like that the query output channel is different from the one getting error messages - and even errors from the server and raised in your procedures go different ways.
out.sql contains
in both cases.
This is why I am clueless about what channel/file descriptor is used for outputting the messages raised from a procedure.)
)
(There is a thread on PostgreSQL-hackers that may shed some light on this issue: http://postgresql.1045698.n5.nabble.com/psql-output-locations-td5068313.html )
What one could possibly do is starting
and this will redirect all output to the specified file. The only problem with this that you don't even have a prompt, and lose the commandline editing capabilities.
From the psql documentation:
Saves future query results to the file filename or pipes future
results into a separate Unix shell to execute command. If no arguments
are specified, the query output will be reset to the standard output.
"Query results" includes all tables, command responses, and notices
obtained from the database server, as well as output of various
backslash commands that query the database (such as \d), but not error
messages.
And as you noticed, there is no way redirecting error messages when using
psql interactively.(I've been playing around with all kinds of redirection from \o to no avail. It looks like that the query output channel is different from the one getting error messages - and even errors from the server and raised in your procedures go different ways.
test=# SHOW client_min_messages;
client_min_messages
---------------------
notice
-- added the above to show it's not a config problem
CREATE FUNCTION raise_test() RETURNS integer AS
$body$
BEGIN
RAISE NOTICE 'notice';
RETURN 1;
END;
$body$
LANGUAGE plpgsql;
test=# \o | cat > out.sql
test=# SELECT raise_test(); -- you could put this in a file and call \i your_file, it's just the same
NOTICE: notice
test=# \o | cat > out.sql 2>&1
test=# SELECT raise_test();
NOTICE: noticeout.sql contains
raise_test
------------
1
(1 row)in both cases.
This is why I am clueless about what channel/file descriptor is used for outputting the messages raised from a procedure.)
)
(There is a thread on PostgreSQL-hackers that may shed some light on this issue: http://postgresql.1045698.n5.nabble.com/psql-output-locations-td5068313.html )
What one could possibly do is starting
psql likepsql test >/tmp/psql.out 2>&1and this will redirect all output to the specified file. The only problem with this that you don't even have a prompt, and lose the commandline editing capabilities.
Code Snippets
test=# SHOW client_min_messages;
client_min_messages
---------------------
notice
-- added the above to show it's not a config problem
CREATE FUNCTION raise_test() RETURNS integer AS
$body$
BEGIN
RAISE NOTICE 'notice';
RETURN 1;
END;
$body$
LANGUAGE plpgsql;
test=# \o | cat > out.sql
test=# SELECT raise_test(); -- you could put this in a file and call \i your_file, it's just the same
NOTICE: notice
test=# \o | cat > out.sql 2>&1
test=# SELECT raise_test();
NOTICE: noticeraise_test
------------
1
(1 row)psql test >/tmp/psql.out 2>&1Context
StackExchange Database Administrators Q#23612, answer score: 12
Revisions (0)
No revisions yet.