Come ottenere avvisi sul flusso di output?


20

Ho messaggi di debug nelle funzioni. Quei messaggi vengono sollevati come

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

Ho impostato il mio file di registro con \o messages.txt

Quindi faccio quello che mi serve \i process.sql

E quando l'esecuzione viene interrotta, \o.

Il problema è che non ho i messaggi generati dalle notifiche in message.txt. I messaggi vengono visualizzati sullo schermo ma voglio che vengano scritti in messages.txt

Come potrei farlo?

Ho provato a usare RAISE LOG...e i messaggi sono scritti nel file di registro ... Non è quello che voglio.

Ho un lavoro con

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

ma vorrei sapere come potrei usare \ i e \ o sul client plsql con i messaggi nel file specificato in \ o

Il mio client, su cygwin è psql (PostgreSQL) 8.2.11 e la versione del server è 9.0.7


1
Sebbene non sia la causa del problema, l'utilizzo di psql 8.2 contro Pg 9.0 può causare tutti i tipi di dolore a causa di tutte le modifiche dello schema del catalogo di sistema e delle nuove funzionalità del server. Se riscontri problemi strani o imprevisti, prova con psql 9.x.
Craig Ringer

@CraigRinger Il problema è che il client psql per cygwin non è disponibile. Almeno l'ultima volta che ho provato ad aggiornare il client su Cygwin. Non posso usare la funzionalità \ d, ma tutto il resto sembra ok.
Luc M

@CraigRinger Non sapevo che il client non fosse più supportato. Grazie.
Luc M,

Ho appena ricontrollato; Pensavo che cygwin non fosse supportato e non avevo sentito parlare di nessuno che lo usasse da anni, ma sembra che le persone stiano ancora costruendo PostgreSQL 9.2 beta su Cygwin nel buildfarm ; vedi brolga . Dovrebbe funzionare. Probabilmente dovrai solo compilare dal sorgente se vuoi l'attuale Pg, saranno solo i pacchetti binari di Cygwin che non saranno mantenuti. Eliminerò quel commento per evitare qualsiasi confusione futura.
Craig Ringer,

La domanda rimane però: perché usare Cygwin per psql? libpqPotrei capire se hai un software non portatile che deve essere eseguito in Cygwin, ma quando psqlè disponibile in modo nativo per Windows qual è il fascino di eseguire una versione antica su Cygwin?
Craig Ringer,

Risposte:


8

Temo che non ti piacerà questa risposta, ma al momento sembra impossibile. Dalla documentazione psql :

Salva i risultati delle query future nel nome file del file o convoglia i risultati futuri in una shell Unix separata per eseguire il comando. Se non viene specificato alcun argomento, l'output della query verrà reimpostato sull'output standard.

"Risultati della query" include tutte le tabelle, le risposte ai comandi e le notifiche ottenute dal server di database, nonché l'output di vari comandi di barra rovesciata che interrogano il database (come \ d), ma non i messaggi di errore.

E come hai notato, non è possibile reindirizzare i messaggi di errore quando si utilizza in modo psqlinterattivo.

(Ho giocato con tutti i tipi di reindirizzamento da \ o inutilmente. Sembra che il canale di output della query sia diverso da quello che riceve i messaggi di errore - e anche gli errori dal server e sollevati nelle tue procedure vanno in modi diversi .

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

contiene out.sql

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

in entrambi i casi. Questo è il motivo per cui non ho idea di quale canale / descrittore di file viene utilizzato per emettere i messaggi sollevati da una procedura.))

(C'è un thread sugli hacker PostgreSQL che potrebbe far luce su questo problema: http://postgresql.1045698.n5.nabble.com/psql-output-locations-td5068313.html )

Quello che uno potrebbe eventualmente fare è iniziare psqlcome

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

e questo reindirizzerà tutto l'output sul file specificato. L'unico problema è che non hai nemmeno un prompt e perdi le funzionalità di modifica della riga di comando.


1
No, non mi piace la tua risposta. :-)
Luc M

il descrittore di canale / file viene utilizzato per emettere i messaggi generati da una procedura : è l'errore standard. \o | cat > out.sql 2>&1reindirizza l'errore standard catma non quello di psql, quindi non serve a nulla per gli avvisi.
Daniel Vérité,

@dezso, in che modo pgAdmin o altri strumenti della GUI visualizzano le NOTICEinformazioni?
Spike

@Spike non sono costruiti sopra psql, quindi probabilmente senza problemi.
dezso

@dezso, sì ho capito. Ho avuto un problema simile, ho impostato client_min_messagea debugnel mio sessione ed eseguire alcuni sqls dinamici con ( DO- senza creare alcuna funzione), si solleva avviso pgAdmin da non con psql. Ho stampato il client_min_messagevalore prima dell'esecuzione DOdell'istruzione. Viene visualizzato debug, ma il messaggio non viene stampato nella console.
Spike

2

Possiamo eseguire il comando shell direttamente da psql usando il \!meta comando.

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

aperto debug.txtcon \e.

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

il messaggio di rilancio verrà mostrato nell'editor predefinito. un po 'complicato, ancora abbastanza utile per l'amante di commandLine.


0

Non una soluzione alla domanda originale, ma un'aggiunta alla soluzione alternativa di OP (che non ha funzionato per me)


Con quanto segue come 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;



Non sono sicuro, perché la scrittura dell'output in un file come indicato nell'OP non funziona, ma il piping in tee in realtà ha funzionato:

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


Tee scrive lo stdin in uno o più file e torna nello stdout. Quindi avrai tutte le istruzioni RAISE nella tua console e nei file che hai fornito. (vedi la pagina man di tee )


Configurazione:

  • Postgres 8.4
  • Cygwin 2.0.2
  • tee 8.23

La domanda era su come ottenere i messaggi sollevati NOTICEmentre si è in una sessione interattiva e utilizzare\o
Luc M,

Oh, sei proprio lì. Ho perso totalmente quella parte, poiché la soluzione alternativa nel PO non ha funzionato per me e mi sono concentrato solo su questo.
Father Stack,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.