Como obter avisos para o fluxo de saída?


20

Eu tenho mensagens de depuração em funções. Essas mensagens são levantadas como

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

Defino meu arquivo de log com \o messages.txt

Então eu faço o que eu preciso fazer com \i process.sql

E quando a execução terminar \o,.

O problema é que não tenho as mensagens geradas por avisos no messages.txt. As mensagens são exibidas na tela, mas eu quero que elas sejam escritas em messages.txt

Como eu pude fazer isso?

Eu tentei usar RAISE LOG...e as mensagens são escritas no arquivo de log ... Não é o que eu quero.

Eu tenho um trabalho em torno de

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

mas gostaria de saber como eu poderia usar \ i e \ o no cliente plsql com as mensagens no arquivo especificado em \ o

Meu cliente, no cygwin, é o psql (PostgreSQL) 8.2.11 e a versão do servidor é 9.0.7


11
Embora não seja a causa do seu problema, o uso do psql 8.2 na página 9.0 pode causar todo tipo de pesar, devido a todas as alterações no esquema do catálogo do sistema e aos novos recursos do servidor. Se você encontrar problemas estranhos ou inesperados, tente com o psql 9.x.
Craig Ringer

@ CraigRinger O problema é que o psql do cliente para cygwin não está disponível. Pelo menos a última vez que tentei atualizar o cliente no cygwin. Não posso usar a funcionalidade \ d, mas todo o resto parece ok.
Luc M

@CraigRinger Não sabia que o cliente não era mais suportado. Obrigado.
Luc M

Eu apenas verifiquei isso; Eu pensei que o cygwin não era suportado e eu não ouvia falar de ninguém por muito tempo, mas parece que as pessoas ainda estão criando o PostgreSQL 9.2 beta no Cygwin no buildfarm ; veja brolga . Deveria funcionar. Você provavelmente terá que compilar a partir do código-fonte, se quiser a página atual, serão apenas os pacotes binários do Cygwin que não são mantidos. Excluirei esse comentário para evitar futuras confusões.
Craig Ringer

A questão permanece: por que usar o Cygwin psql? libpqEu poderia entender se você tem um software não portátil que precisa ser executado no Cygwin, mas quando psqlestá disponível nativamente para Windows, qual é o atrativo de executar uma versão antiga no Cygwin?
Craig Ringer

Respostas:


8

Receio que você não goste desta resposta, mas atualmente parece impossível. Na documentação do psql :

Salva os resultados futuros da consulta no nome do arquivo ou canaliza os resultados futuros em um shell Unix separado para executar o comando. Se nenhum argumento for especificado, a saída da consulta será redefinida para a saída padrão.

"Resultados da consulta" inclui todas as tabelas, respostas de comandos e avisos obtidos do servidor de banco de dados, bem como a saída de vários comandos de barra invertida que consultam o banco de dados (como \ d), mas não as mensagens de erro.

E como você notou, não há como redirecionar mensagens de erro ao usar psqlinterativamente.

(Venho brincando com todos os tipos de redirecionamento de \ o sem sucesso. Parece que o canal de saída da consulta é diferente daquele que recebe mensagens de erro - e até mesmo erros do servidor e disparados em seus procedimentos são diferentes. .

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 contém

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

em ambos os casos. É por isso que não entendo qual descritor de canal / arquivo é usado para gerar as mensagens geradas por um procedimento.))

(Existe uma discussão nos hackers do PostgreSQL que pode lançar alguma luz sobre esse problema: http://postgresql.1045698.n5.nabble.com/psql-output-locations-td5068313.html )

O que alguém poderia fazer é começar psqlcomo

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

e isso redirecionará toda a saída para o arquivo especificado. O único problema com isso é que você nem tem um prompt e perde os recursos de edição da linha de comando.


11
Não, não gosto da sua resposta. :-)
Luc M

O descritor de canal / arquivo é usado para emitir as mensagens geradas a partir de um procedimento : é o erro padrão. \o | cat > out.sql 2>&1redireciona o erro padrão de, catmas não o de psql, portanto, não serve para os avisos.
Daniel Vérité

@dezso, como o pgAdmin ou qualquer outra ferramenta GUI exibe as NOTICEinformações?
Spike

@ Spike eles não são construídos em cima psql, provavelmente sem problemas.
dezso 5/09

@ Dezso, sim, entendi. Eu tenho um problema semelhante que tenho posto client_min_messagepara debugdentro do meu sessão e executar alguns sqls dinâmicos com ( DO- sem criar qualquer função), ele levanta anúncio no pgAdmin por não com psql. Imprimi o client_min_messagevalor antes de executar a DOinstrução. Isso mostra debug, mas a mensagem não está sendo impressa no console.
Spike

2

Podemos executar o comando shell diretamente do psql usando o \!comando meta.

localhost: 5432 usuário @ db = # \! psql -U usuário -h localhost your_database -e 'selecione your_function_name ()'> debug.txt 2> & 1

abrir debug.txtcom \e.

localhost: 5432 user @ db = # \ e debug.txt

A mensagem raise será mostrada no seu editor padrão. um pouco complicado, ainda bastante útil para os amantes de CommandLine.


0

Não é uma solução para a pergunta original, mas uma adição à solução alternativa do OP (que não funcionou para mim)


Com o seguinte como 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;



Não tenho certeza, por que gravar a saída em um arquivo como o observado no OP não funciona, mas encaminhá-lo para o tee realmente funcionou:

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


Tee grava o stdin em um ou mais arquivos e volta ao stdout. Portanto, você terá todas as instruções RAISE no seu console e nos arquivos que você forneceu. (consulte a página de manual do tee )


Configuração:

  • Postgres 8.4
  • Cygwin 2.0.2
  • tee 8.23

A pergunta era sobre a obtenção das mensagens levantadas por NOTICEenquanto você estiver em uma sessão e uso interativo\o
Luc M

Oh, você está aí. Perdi totalmente essa parte, pois a solução alternativa no OP não funcionou para mim e me concentrei apenas nisso.
Father Stack
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.