Eu tenho mensagens de depuração em funções. Essas mensagens são levantadas como
RAISE NOTICE 'Value of id : %', id;
Eu configurei 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 é encerrada, \o
.
O problema é que não tenho as mensagens geradas por avisos em messages.txt. As mensagens são exibidas na tela, mas eu quero que elas sejam escritas em messages.txt
Como eu poderia fazer isso?
Tentei usar RAISE LOG...
e as mensagens são escritas em arquivo de log... Não é o que eu quero.
Eu tenho um trabalho com
plsql -f /path/to/process.sql > messages.txt 2>&1
mas gostaria de saber como poderia usar \i e \o no cliente plsql tendo 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
Receio que você não goste desta resposta, mas atualmente parece impossível. Da documentação do psql :
E como você notou, não há como redirecionar mensagens de erro ao usar
psql
interativamente.(Eu tenho brincado 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 gerados em seus procedimentos seguem caminhos diferentes .
out.sql contém
em ambos os casos. É por isso que não tenho ideia de qual descritor de canal/arquivo é usado para gerar as mensagens geradas por um procedimento.) )
(Há um tópico sobre hackers do PostgreSQL que pode esclarecer esse problema: http://postgresql.1045698.n5.nabble.com/psql-output-locations-td5068313.html )
O que se poderia fazer é começar
psql
comoe 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.
Podemos executar o comando shell diretamente do psql usando
\!
o comando meta.aberto
debug.txt
com\e
.mensagem de aumento será mostrada em seu editor padrão. um pouco complicado, ainda bastante útil para o amante do commandLine.
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
Não tenho certeza, por que escrever a saída em um arquivo como observado no OP não funciona, mas canalizá-lo para o tee realmente funcionou:
Tee grava o stdin em um ou mais arquivos e volta no stdout. Assim, você terá todas as instruções RAISE em seu console e no(s) arquivo(s) fornecido(s). (cf. página de manual do tee )
Configuração:
Aqui está uma função para imprimir em stdout e stderr, útil para rastrear execuções de script na nuvem.