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
quelle
psql
?libpq
Ich könnte verstehen, dass Sie nicht tragbare Software haben, die in Cygwin ausgeführt werden muss, aber wannpsql
ist sie nativ für Windows verfügbar? Was ist der Reiz daran, eine alte Version unter Cygwin auszuführen?Antworten:
Ich fürchte, dass Ihnen diese Antwort nicht gefällt, aber derzeit scheint es unmöglich. Aus der psql-Dokumentation :
Und wie Sie bemerkt haben, können Fehlermeldungen bei der
psql
interaktiven 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 .
out.sql enthält
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
psql
wieDadurch 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.
quelle
\o | cat > out.sql 2>&1
Leitet den Standardfehler von um,cat
aber nicht den vonpsql
. Daher ist dies für die Benachrichtigungen nicht von Nutzen.NOTICE
Informationen an?psql
, also wahrscheinlich ohne Probleme.client_min_message
umdebug
in 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 denclient_min_message
Wert vor dem Ausführen derDO
Anweisung gedruckt . Es wird angezeigtdebug
, aber die Nachricht wird nicht in der Konsole gedruckt.Wir können den Shell-Befehl direkt aus psql mit dem
\!
Meta-Befehl ausführen .öffnen
debug.txt
mit\e
.Eine Nachricht wird in Ihrem Standardeditor angezeigt. Ein bisschen knifflig, aber für CommandLine-Liebhaber immer noch recht praktisch.
quelle
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
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:
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:
quelle
NOTICE
während Sie sich in einer interaktiven Sitzung befinden und verwenden\o