Bagaimana cara mendapatkan pemberitahuan ke aliran output?

20

Saya memiliki fungsi debug pada pesan. Pesan itu dimunculkan seperti

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

Saya mengatur file log dengan \o messages.txt

Lalu saya melakukan apa yang harus saya lakukan \i process.sql

Dan ketika eksekusi dihentikan \o,.

Masalahnya adalah bahwa saya tidak memiliki pesan yang diangkat oleh pemberitahuan ke messages.txt. Pesan-pesan ditampilkan di layar tetapi saya ingin mereka ditulis di messages.txt

Bagaimana saya bisa melakukan itu?

Saya mencoba menggunakan RAISE LOG...dan pesan ditulis dalam file log ... Bukan itu yang saya inginkan.

Saya punya pekerjaan dengan

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

tapi saya ingin tahu bagaimana saya bisa menggunakan \ i dan \ o pada klien plsql memiliki pesan ke file yang ditentukan dalam \ o

Klien saya, di cygwin adalah psql (PostgreSQL) 8.2.11 dan versi server 9.0.7

Luc M
sumber
1
Meskipun bukan penyebab masalah Anda, menggunakan psql 8.2 melawan Pg 9.0 dapat menyebabkan Anda semua jenis kesedihan karena semua perubahan skema katalog sistem dan fitur server baru. Jika Anda menemukan masalah aneh atau tidak terduga, coba dengan psql 9.x.
Craig Ringer
@CraigRinger Masalahnya adalah bahwa psql klien untuk cygwin tidak tersedia. Setidaknya terakhir kali saya mencoba memutakhirkan klien di cygwin. Saya tidak dapat menggunakan fungsionalitas tetapi segalanya tampak ok.
Luc M
@CraigRinger Tidak tahu bahwa klien tidak lagi didukung. Terima kasih.
Luc M
Saya baru saja mengeceknya; Saya pikir cygwin tidak didukung dan saya belum pernah mendengar ada orang yang menggunakannya selama berabad-abad, tetapi sepertinya orang masih membuat PostgreSQL 9.2 beta di Cygwin di buildfarm ; lihat brolga . Itu harus bekerja. Anda mungkin hanya perlu mengkompilasi dari sumber jika Anda ingin Pg saat ini, itu hanya akan menjadi paket Cygwin biner yang tidak terawat. Saya akan menghapus komentar itu untuk menghindari kebingungan di masa depan.
Craig Ringer
Pertanyaannya tetap: Mengapa menggunakan Cygwin untuk psql?libpqSaya bisa mengerti jika Anda memiliki perangkat lunak non-portabel yang harus berjalan di Cygwin, tetapi kapan psqltersedia secara native untuk Windows apa daya tarik menjalankan versi kuno di Cygwin?
Craig Ringer

Jawaban:

8

Saya khawatir Anda tidak akan menyukai jawaban ini, tetapi saat ini tampaknya tidak mungkin. Dari dokumentasi psql :

Menyimpan hasil kueri di masa mendatang ke nama file file atau menyalurkan hasil di masa mendatang ke dalam shell Unix yang terpisah untuk menjalankan perintah. Jika tidak ada argumen yang ditentukan, output permintaan akan diatur ulang ke output standar.

"Hasil kueri" mencakup semua tabel, respons perintah, dan pemberitahuan yang diperoleh dari server database, serta output dari berbagai perintah backslash yang menanyakan database (seperti \ d), tetapi bukan pesan kesalahan.

Dan seperti yang Anda perhatikan, tidak ada cara mengarahkan pesan kesalahan saat menggunakan secara psqlinteraktif.

(Saya telah bermain-main dengan semua jenis pengalihan dari \ o tidak berhasil. Sepertinya saluran kueri keluaran berbeda dari yang menerima pesan kesalahan - dan bahkan kesalahan dari server dan dibesarkan dalam prosedur Anda berjalan dengan cara yang berbeda .

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 berisi

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

dalam kedua kasus. Inilah sebabnya saya tidak tahu tentang apa saluran / file descriptor digunakan untuk mengeluarkan pesan yang muncul dari suatu prosedur.))

(Ada utas tentang peretas PostgreSQL yang mungkin menjelaskan masalah ini: http://postgresql.1045698.n5.nabble.com/psql-output-locations-td5068313.html )

Apa yang bisa dilakukan adalah mulai psql seperti

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

dan ini akan mengarahkan semua output ke file yang ditentukan. Satu-satunya masalah dengan ini bahwa Anda bahkan tidak memiliki prompt, dan kehilangan kemampuan pengeditan baris perintah.

dezso
sumber
1
Tidak, saya tidak suka jawaban Anda. :-)
Luc M
deskriptor saluran / file digunakan untuk mengeluarkan pesan yang muncul dari suatu prosedur : itu adalah kesalahan standar. \o | cat > out.sql 2>&1mengalihkan kesalahan standar cattetapi bukan kesalahan psql, jadi tidak ada gunanya untuk pemberitahuan.
Daniel Vérité
@dezso, Bagaimana pgAdmin atau alat GUI lainnya menampilkan NOTICEinformasi?
Spike
@ Spike mereka tidak membangun di atas psql, jadi mungkin tanpa masalah.
dezso
@dezso, ya saya mengerti. Saya mendapat masalah seperti, saya telah menetapkan client_min_messageke debugdalam sesi saya dan menjalankan beberapa sqls dinamis dengan ( DO- tanpa membuat fungsi apa pun), itu menimbulkan pemberitahuan di pgAdmin dengan tidak dengan psql. Saya mencetak client_min_messagenilai sebelum mengeksekusi DOpernyataan. Itu menunjukkan debug, tetapi pesan tidak mencetak di konsol.
Spike
2

Kita dapat menjalankan perintah shell langsung dari psql menggunakan \!perintah meta.

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

terbuka debug.txtdengan \e.

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

naikkan pesan akan ditampilkan di editor default Anda. agak rumit, masih cukup berguna untuk pencinta commandLine.

Brain90
sumber
0

Bukan solusi untuk Pertanyaan asli, tetapi tambahan untuk solusi OP (yang tidak berhasil untuk saya)


Dengan yang berikut ini sebagai raisTest.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;



Saya tidak yakin, mengapa menulis output ke file seperti yang tercantum dalam OP tidak bekerja, tetapi menyalurkannya ke tee benar-benar berhasil:

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


Tee menulis stdin menjadi satu atau lebih file dan kembali ke stdout. Jadi, Anda akan memiliki semua pernyataan RAISE di konsol Anda dan dalam file yang Anda berikan. (lih. halaman manual tee )


Konfigurasi:

  • Postgres 8.4
  • Cygwin 2.0.2
  • tee 8.23
Ayah Stack
sumber
Pertanyaannya adalah tentang mendapatkan pesan yang diangkat NOTICEsaat Anda memasuki sesi interaktif dan gunakan\o
Luc M
Oh, kamu di sana. Saya benar-benar merindukan bagian itu, karena solusi di OP tidak bekerja untuk saya dan saya hanya berkonsentrasi pada ini.
Pastor Stack