it-swarm-eu.dev

Jak získat upozornění na výstupní proud?

Mám ladicí zprávy ve funkcích. Tyto zprávy jsou vyvolány jako

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

Soubor protokolu jsem nastavil pomocí \o messages.txt

Pak udělám, co musím udělat s \i process.sql

A když je provádění ukončeno, \o.

Problém je v tom, že nemám zprávy vyvolávané upozorněními do messages.txt. Zprávy se zobrazují na obrazovce, ale chci, aby byly zapsány do souboru messages.txt

Jak bych to mohl udělat?

Snažil jsem se použít RAISE LOG... a zprávy jsou zapsány do souboru protokolu ... To není to, co chci.

Mám tu práci

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

ale rád bych věděl, jak mohu použít\i a\o na plsql klientovi, který má zprávy do souboru uvedeného v\o

Můj klient, na cygwin, je psql (PostgreSQL) 8.2.11 a verze serveru je 9.0.7

21
Luc M

Obávám se, že se vám tato odpověď nebude líbit, ale v současné době se to zdá nemožné. Z dokumentace psql :

Uloží budoucí výsledky dotazů do souboru název souboru nebo rozdělí budoucí výsledky do samostatného prostředí Unix Shell k provedení příkazu. Pokud nejsou zadány žádné argumenty, výstup dotazu bude resetován na standardní výstup.

"Výsledky dotazu" zahrnují všechny tabulky, odpovědi na příkazy a upozornění získaná z databázového serveru, jakož i výstup různých příkazů zpětného lomítka, které dotazují databázi (například\d), ale nikoli chybové zprávy.

A jak jste si všimli, při interaktivním použití psql neexistuje způsob přesměrování chybových zpráv.

(Hrál jsem se všemi druhy přesměrování z\na bezvýsledně. Vypadá to, že výstupní kanál dotazu se liší od toho, který zobrazuje chybové zprávy - a dokonce i chyby ze serveru a vyvolané ve vašich postupech jdou různými způsoby .

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 obsahuje

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

v obou případech. To je důvod, proč jsem bezradný ohledně toho, jaký deskriptor kanálu/souboru se používá pro výstup zpráv získaných z procedury.))

(Na hackerech PostgreSQL je vlákno, které může v tomto problému vrhnout nějaké světlo: http://postgresql.1045698.n5.nabble.com/psql-output-locations-td5068313.html )

Co by se dalo udělat, je začít psql like

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

a to přesměruje veškerý výstup do zadaného souboru. Jediný problém s tím, že nemáte ani výzvu, a ztratíte schopnosti úprav příkazového řádku.

8
dezso

Můžeme spustit příkaz Shell přímo z psql pomocí \! meta příkaz.

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

otevřeno debug.txt s \e.

 localhost: 5432 uživatel @ db = #\e debug.txt 

zpráva vyvolání se zobrazí ve výchozím editoru. trochu komplikovaný, stále docela užitečný pro milence CommandLine.

2
Brain90

Ne řešení původní otázky, ale doplněk k řešení OP (které pro mě nefungovalo)


Následující text jako boostTest.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;



Nejsem si jistý, proč zápis výstupu do souboru, jak je uvedeno v OP, nefunguje, ale jeho vložení do odpaliště skutečně vyšlo:

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


Tee zapíše stdin do jednoho nebo více souborů a zpět do stdout. Takže budete mít všechny příkazy RAISE ve své konzoli a v zadaných souborech. (srov. tee's man page )


Konfigurace:

  • Postgres 8.4
  • Cygwin 2.0.2
  • tričko 8.23
0
Father Stack