如何获取输出流的通知?


20

我在函数中有调试消息。这些消息像

RAISE NOTICE 'Value of id : %', id;

我将日志文件设置为 \o messages.txt

然后我要做我需要做的 \i process.sql

当执行终止时,\o

问题是我没有将通知引起的消息放入messages.txt中。消息显示在屏幕上,但我希望将它们写在messages.txt中

我该怎么办?

我尝试使用,RAISE LOG...并且消息被写在日志文件中……这不是我想要的。

我有一个工作

plsql -f /path/to/process.sql > messages.txt 2>&1

但我想知道如何在plsql客户端上使用\ i和\ o并将消息放入\ o中指定的文件中

我在cygwin上的客户端是psql(PostgreSQL)8.2.11,服务器版本是9.0.7


1
尽管不是问题的根源,但由于所有系统目录架构更改和新的服务器功能,对pg 9.0使用psql 8.2可能会引起各种麻烦。如果遇到奇怪或意外的问题,请尝试使用psql9.x。
Craig Ringer 2012年

@CraigRinger问题是cygwin的客户端psql不可用。至少上一次我尝试在cygwin上升级客户端。我无法使用\ d功能,但其他一切似乎还可以。
吕克M

@CraigRinger不知道该客户端不再受支持。谢谢。
吕克M

我只是仔细检查了一下;我以为 cygwin是不受支持的,而且很长一段时间都没有人听说过它,但是看来人们仍然在buildfarm的 Cygwin上构建PostgreSQL 9.2 beta 。见brolga。它应该工作。如果您想要当前的Pg,可能就只需要从源代码进行编译即可,它只是不需维护的二进制Cygwin软件包。我将删除该评论以避免将来造成任何混乱。
Craig Ringer 2012年

问题仍然存在:为什么要使用Cygwin psqllibpq我能理解您是否必须在Cygwin中运行非便携式软件,但是当psqlWindows本身可以使用Windows 时,在Cygwin上运行旧版本的吸引力是什么?
Craig Ringer 2012年

Answers:


8

恐怕您不会喜欢这个答案,但是目前看来这是不可能的。从psql文档中

将将来的查询结果保存到文件名中,或将将来的结果通过管道传递到单独的Unix Shell中以执行命令。如果未指定任何参数,则查询输出将重置为标准输出。

“查询结果”包括从数据库服务器获得的所有表,命令响应和通知,以及查询数据库的各种反斜杠命令的输出(例如\ d),但不包括错误消息。

而且,您已经注意到,以psql交互方式使用时,无法重定向错误消息。

(我一直在尝试各种从\ o重定向到无用的重定向。看起来查询输出通道与获取错误消息的通道不同-甚至来自服务器的错误以及在您的过程中引发的错误都以不同的方式发生。 。

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:  notice

out.sql包含

 raise_test
------------
          1
(1 row)

在两种情况下。这就是为什么我不知道使用哪个通道/文件描述符来输出从过程中引发的消息的原因。))

(PostgreSQL黑客上有一个线程可能可以阐明此问题:http : //postgresql.1045698.n5.nabble.com/psql-output-locations-td5068313.html

一个人可能会做的psql

psql test >/tmp/psql.out 2>&1

并将所有输出重定向到指定文件。唯一的问题是您甚至没有提示,并且失去了命令行编辑功能。


1
不,我不喜欢你的回答。:-)
吕克M

通道/文件描述符用于输出从过程中引发的消息:这是标准错误。\o | cat > out.sql 2>&1重定向标准错误,cat但不会重定向psql,因此对于通知没有用。
DanielVérité15年

@ dezso,pgAdmin或任何其他GUI工具如何显示NOTICE信息?
秒杀

@Spike它们不是基于构建的psql,因此可能没有任何问题。
dezso

@dezso,是的,我明白了。我得到了像,我设置的问题client_min_message,以debug我的会话中,并运行一些动态sql语句(DO-不会造成任何功能),它通过不提出通知的pgAdmin用psql。我client_min_message在执行DO语句之前打印了该值。它显示debug,但该消息未在控制台中打印。
秒杀

2

我们可以使用\!meta命令从psql直接执行shell 命令。

本地主机:5432 user @ db =#\!psql -U用户-h localhost your_database -e'选择your_function_name()'> debug.txt 2>&1

打开debug.txt\e

本地主机:5432 user @ db =#\ e debug.txt

提高消息将显示在默认编辑器中。有点棘手,对于命令行爱好者仍然很方便。


0

不是原始问题的解决方案,而是OP的解决方法的补充(这对我不起作用)


用下面的作为raiseTest.sql

BEGIN;

CREATE FUNCTION count_to_hundred() RETURNS VOID AS
$_$
BEGIN
    FOR i IN 1..100 
    LOOP
        RAISE NOTICE '%', i;
    END LOOP;

    RETURN;
END;
$_$
LANGUAGE plpgsql;


SELECT count_to_hundred();

ROLLBACK;



我不确定,为什么将输出写入OP中所述的文件不起作用,但实际上将其通过管道输送到tee中就可以了:

psql -f raiseTest.sql 2>&1 | tee messages.txt


Tee将标准输入写入一个或多个文件,然后再返回至标准输出。因此,您将在控制台和提供的文件中拥有所有RAISE语句。(请参阅tee的手册页


组态:

  • PostgreSQL 8.4
  • Cygwin 2.0.2
  • 三通8.23

问题是关于NOTICE在进行交互式会话和使用时发出消息的问题\o
Luc M

哦,你就在那里。我完全错过了那部分,因为OP中的解决方法对我不起作用,我只专注于此。
父亲栈
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.