Jak uzyskać powiadomienia do strumienia wyjściowego?

20

Mam funkcje debugowania w funkcjach. Te przesłania są podnoszone jak

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

Ustawiam mój plik dziennika za pomocą \o messages.txt

Następnie robię to, co muszę zrobić \i process.sql

A gdy wykonanie jest rozwiązana \o.

Problem polega na tym, że nie mam wiadomości podniesionych przez powiadomienia do messages.txt. Wiadomości są wyświetlane na ekranie, ale chcę, aby zostały napisane w messages.txt

Jak mogłem to zrobić?

Próbowałem użyć, RAISE LOG...a wiadomości są zapisywane w pliku dziennika ... Nie tego chcę.

Mam z tym problem

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

ale chciałbym wiedzieć, jak mogę użyć \ i i \ o na kliencie plsql, który ma komunikaty w pliku określonym w \ o

Mój klient na cygwin to psql (PostgreSQL) 8.2.11, a wersja serwera to 9.0.7

Luc M.
źródło
1
Chociaż nie jest to przyczyną problemu, użycie psql 8.2 w stosunku do Pg 9.0 może wywoływać różnego rodzaju żal z powodu wszystkich zmian schematu katalogu systemowego i nowych funkcji serwera. Jeśli napotkasz dziwne lub nieoczekiwane problemy, wypróbuj psql 9.x.
Craig Ringer
@CraigRinger Problem polega na tym, że psql klienta dla cygwin nie jest dostępny. Przynajmniej ostatnią próbę uaktualnienia klienta na cygwin. Nie mogę użyć funkcji \ d, ale wszystko inne wydaje się być w porządku.
Luc M
@CraigRinger Nie wiedziałem, że klient nie jest już obsługiwany. Dzięki.
Luc M
Właśnie to sprawdziłem; Myślałem, że cygwin nie jest obsługiwany i nie słyszałem o nikim używającym go od wieków, ale wygląda na to, że ludzie nadal budują PostgreSQL 9.2 beta na Cygwin w buildfarm ; patrz brolga . To powinno działać. Prawdopodobnie będziesz musiał po prostu skompilować ze źródła, jeśli chcesz obecną Pg, będą to po prostu binarne pakiety Cygwin, które nie zostaną zachowane. Usunę ten komentarz, aby uniknąć przyszłego zamieszania.
Craig Ringer
Pozostaje jednak pytanie: po co używać Cygwin psql? libpqMogę zrozumieć, jeśli masz nieprzenośne oprogramowanie, które musi działać w Cygwin, ale kiedy psqljest dostępne natywnie dla systemu Windows, jaki jest urok uruchamiania starożytnej wersji na Cygwin?
Craig Ringer

Odpowiedzi:

8

Obawiam się, że nie spodoba ci się ta odpowiedź, ale obecnie wydaje się to niemożliwe. Z dokumentacji psql :

Zapisuje przyszłe wyniki zapytania do nazwy pliku lub potoków przyszłych wyników w osobnej powłoce uniksowej w celu wykonania polecenia. Jeśli nie podano żadnych argumentów, dane wyjściowe zapytania zostaną zresetowane do standardowego wyniku.

„Wyniki zapytania” obejmują wszystkie tabele, odpowiedzi na polecenia i powiadomienia otrzymane z serwera bazy danych, a także dane wyjściowe różnych poleceń odwrotnego ukośnika, które przeszukują bazę danych (takich jak \ d), ale nie komunikaty o błędach.

Jak zauważyłeś, nie ma możliwości przekierowania komunikatów o błędach podczas korzystania psqlinteraktywnego.

(Bawiłem się z wszelkiego rodzaju przekierowaniami od \ o do bezskuteczności. Wygląda na to, że kanał wyjściowy zapytania różni się od tego, w którym pojawiają się komunikaty o błędach - a nawet błędy z serwera i zgłaszane w twoich procedurach działają na różne sposoby .

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 zawiera

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

w obu przypadkach. Dlatego nie mam pojęcia, jakiego deskryptora kanału / pliku używa się do wyprowadzania komunikatów wywołanych przez procedurę.))

(Istnieje wątek na temat hakerów PostgreSQL, który może rzucić nieco światła na ten problem: http://postgresql.1045698.n5.nabble.com/psql-output-locations-td5068313.html )

Co można zrobić, to być może wychodząc psqljak

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

a to przekieruje wszystkie dane wyjściowe do określonego pliku. Jedyny problem z tym, że nie masz nawet monitu i tracisz możliwości edycji wiersza poleceń.

dezso
źródło
1
Nie, nie podoba mi się twoja odpowiedź. :-)
Luc M
deskryptor kanału / pliku służy do wyprowadzania komunikatów wywołanych przez procedurę : jest to błąd standardowy. \o | cat > out.sql 2>&1przekierowuje standardowy błąd, catale nie ten psql, więc nie ma sensu dla powiadomień.
Daniel Vérité
@dezso, w jaki sposób pgAdmin lub jakiekolwiek inne narzędzie GUI wyświetla NOTICEinformacje?
Spike
@Spike nie są budowane na wierzchu psql, więc prawdopodobnie bez żadnych problemów.
dezso
@dezso, tak, rozumiem. Mam problem, jak, mam ustawione client_min_messagedo debugwewnątrz mojej sesji i uruchomić jakieś zapytania SQL dynamiczne z ( DO- bez tworzenia funkcji), to podnosi zawiadomienie w pgAdmin przez nie z psql. Wydrukowałem client_min_messagewartość przed wykonaniem DOinstrukcji. Pokazuje debug, ale komunikat nie jest drukowany w konsoli.
Spike
2

Możemy wykonać polecenie powłoki bezpośrednio z psql za pomocą \!polecenia meta.

localhost: 5432 użytkownik @ db = # \! psql -U użytkownik -h localhost twoja_bazy danych -e 'wybierz twoja_nazwa_funkcji ()'> debug.txt 2> & 1

otwórz za debug.txtpomocą \e.

localhost: 5432 użytkownik @ db = # \ e debug.txt

wiadomość o podniesieniu pojawi się w domyślnym edytorze. nieco podstępne, wciąż całkiem przydatne dla miłośnika CommandLine.

Mózg 90
źródło
0

Nie jest to rozwiązanie pierwotnego pytania, ale dodatek do obejścia OP (które nie działało dla mnie)


Z następującymi nazwami: 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;



Nie jestem pewien, dlaczego zapisywanie wyniku do pliku takiego jak zaznaczono w OP nie działa, ale pipowanie go do tee faktycznie się udało:

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


Tee zapisuje standardowe wejście w jeden lub więcej plików i powrót do standardowego wejścia. Będziesz więc mieć wszystkie instrukcje RAISE w konsoli i podanych plikach. (patrz strona podręcznika tee )


Konfiguracja:

  • Postgres 8.4
  • Cygwin 2.0.2
  • tee 8.23
Ojciec stosu
źródło
Pytanie dotyczyło podniesienia wiadomości NOTICEpodczas interaktywnej sesji i korzystania\o
Luc M
Och, jesteś tam. Całkowicie tęskniłem za tą częścią, ponieważ obejście w PO nie zadziałało dla mnie i skoncentrowałem się tylko na tym.
Ojciec stos