Wie bekomme ich Benachrichtigungen zum Ausgabestream?

20

Ich habe Debugging-Meldungen in Funktionen. Diese Nachricht wird wie angehoben

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

Ich setze meine Logdatei mit \o messages.txt

Dann mache ich, was ich tun muss \i process.sql

Und wenn die Ausführung beendet wird , \o.

Das Problem ist, dass ich nicht die Nachrichten habe, die durch Mitteilungen in messages.txt ausgelöst werden. Die Nachrichten werden auf dem Bildschirm angezeigt, aber ich möchte, dass sie in messages.txt geschrieben werden

Wie könnte ich das machen?

Ich habe versucht, zu verwenden RAISE LOG...und Nachrichten werden in Protokolldatei geschrieben ... Es ist nicht das, was ich will.

Ich habe eine Auseinandersetzung mit

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

aber ich würde gerne wissen, wie ich \ i und \ o auf einem plsql-client verwenden könnte, der die nachrichten in die in \ o angegebene datei schreibt

Mein Client unter Cygwin ist psql (PostgreSQL) 8.2.11 und die Serverversion ist 9.0.7

Luc M
quelle
1
Obwohl dies nicht die Ursache für Ihr Problem ist, kann die Verwendung von psql 8.2 gegen Pg 9.0 aufgrund aller Änderungen des Systemkatalogschemas und neuer Serverfunktionen zu allen Arten von Kummer führen. Wenn Sie auf seltsame oder unerwartete Probleme stoßen, versuchen Sie es mit psql 9.x.
Craig Ringer
@CraigRinger Das Problem ist, dass der Client psql für cygwin nicht verfügbar ist. Zumindest das letzte Mal habe ich versucht, den Client auf Cygwin zu aktualisieren. Ich kann die \ d-Funktion nicht verwenden, aber alles andere scheint in Ordnung zu sein.
Luc M
@CraigRinger Wusste nicht, dass der Client nicht mehr unterstützt wird. Vielen Dank.
Luc M
Ich habe das nur zweimal überprüft. Ich dachte, Cygwin wird nicht mehr unterstützt und ich habe schon seit Ewigkeiten nichts mehr davon gehört, aber es sieht so aus, als würden die Leute immer noch PostgreSQL 9.2 Beta auf Cygwin in der Buildfarm bauen . siehe brolga . Es sollte funktionieren. Sie müssen wahrscheinlich nur aus dem Quellcode kompilieren, wenn Sie die aktuelle Pg wollen. Es sind nur die binären Cygwin-Pakete, die nicht gepflegt werden. Ich werde diesen Kommentar löschen, um zukünftige Verwirrungen zu vermeiden.
Craig Ringer
Die Frage bleibt jedoch: Warum Cygwin verwenden psql? libpqIch könnte verstehen, dass Sie nicht tragbare Software haben, die in Cygwin ausgeführt werden muss, aber wann psqlist sie nativ für Windows verfügbar? Was ist der Reiz daran, eine alte Version unter Cygwin auszuführen?
Craig Ringer

Antworten:

8

Ich fürchte, dass Ihnen diese Antwort nicht gefällt, aber derzeit scheint es unmöglich. Aus der psql-Dokumentation :

Speichert zukünftige Abfrageergebnisse in der Datei Dateiname oder leitet zukünftige Ergebnisse in eine separate Unix-Shell um, um den Befehl auszuführen. Wenn keine Argumente angegeben werden, wird die Abfrageausgabe auf die Standardausgabe zurückgesetzt.

"Abfrageergebnisse" umfassen alle vom Datenbankserver erhaltenen Tabellen, Befehlsantworten und Hinweise sowie die Ausgabe verschiedener Backslash-Befehle, die die Datenbank abfragen (z. B. \ d), jedoch keine Fehlermeldungen.

Und wie Sie bemerkt haben, können Fehlermeldungen bei der psqlinteraktiven Verwendung nicht umgeleitet werden .

(Ich habe mit allen Arten der Umleitung von \ o herumgespielt, ohne Erfolg. Es sieht so aus, als ob sich der Abfrage-Ausgabekanal von dem unterscheidet, bei dem Fehlermeldungen angezeigt werden. Sogar Fehler vom Server und die in Ihren Prozeduren aufgetretenen Fehler gehen unterschiedliche Wege .

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 enthält

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

in beiden Fällen. Aus diesem Grund weiß ich nicht, welcher Kanal- / Dateideskriptor für die Ausgabe der von einer Prozedur ausgegebenen Nachrichten verwendet wird.))

(Es gibt einen Thread zu PostgreSQL-Hackern, der möglicherweise etwas Licht in dieses Problem bringt : http://postgresql.1045698.n5.nabble.com/psql-output-locations-td5068313.html )

Was man möglicherweise tun könnte, fängt an psqlwie

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

Dadurch wird die gesamte Ausgabe in die angegebene Datei umgeleitet. Das einzige Problem dabei ist, dass Sie nicht einmal eine Eingabeaufforderung haben und die Befehlszeilen-Bearbeitungsfunktionen verlieren.

dezso
quelle
1
Nein, ich mag deine Antwort nicht. :-)
Luc M
Der Kanal- / Dateideskriptor wird zum Ausgeben der von einer Prozedur ausgegebenen Nachrichten verwendet : Dies ist der Standardfehler. \o | cat > out.sql 2>&1Leitet den Standardfehler von um, cataber nicht den von psql. Daher ist dies für die Benachrichtigungen nicht von Nutzen.
Daniel Vérité
@dezso, Wie zeigt pgAdmin oder ein anderes GUI-Tool die NOTICEInformationen an?
Spike,
@Spike Sie bauen nicht auf psql, also wahrscheinlich ohne Probleme.
5.
@dezso, ja, ich verstehe. Ich habe ein Problem , wie ich festgelegt haben , client_min_messageum debugin meiner Sitzung und einige dynamischen sqls mit laufen ( DO- ohne jede Funktion zu schaffen), es wirft Mitteilung in pgAdmin durch nicht mit psql. Ich habe den client_min_messageWert vor dem Ausführen der DOAnweisung gedruckt . Es wird angezeigt debug, aber die Nachricht wird nicht in der Konsole gedruckt.
Spike
2

Wir können den Shell-Befehl direkt aus psql mit dem \!Meta-Befehl ausführen .

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

öffnen debug.txtmit \e.

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

Eine Nachricht wird in Ihrem Standardeditor angezeigt. Ein bisschen knifflig, aber für CommandLine-Liebhaber immer noch recht praktisch.

Brain90
quelle
0

Keine Lösung für die ursprüngliche Frage, sondern eine Ergänzung zur Problemumgehung von OP (die bei mir nicht funktioniert hat)


Mit den folgenden als 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;



Ich bin mir nicht sicher, warum das Schreiben der Ausgabe in eine Datei, wie im OP vermerkt, nicht funktioniert, aber das Piping in tee hat tatsächlich funktioniert:

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


Tee schreibt das stdin in eine oder mehrere Dateien und zurück in das stdout. Sie haben also alle RAISE-Anweisungen in Ihrer Konsole und in den von Ihnen bereitgestellten Dateien. (vgl. tee's man page )


Aufbau:

  • Postgres 8.4
  • Cygwin 2.0.2
  • T-Stück 8,23
Vater Stack
quelle
Bei der Frage ging es darum, die Nachrichten von zu erhalten, NOTICEwährend Sie sich in einer interaktiven Sitzung befinden und verwenden\o
Luc M
Oh, du bist genau dort. Ich habe diesen Teil total verpasst, da der Workaround im OP bei mir nicht funktioniert hat und ich mich nur darauf konzentriert habe.
Father Stack