Çıktı akışına nasıl bildirim gönderilir?


20

İşlevlerde hata ayıklama iletileri var. Bu mesaj şu şekilde ortaya çıkar:

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

Günlük dosyamı \o messages.txt

Sonra ne yapmam gerekiyorsa onu yaparım \i process.sql

Ve infaz sona erdiğinde \o,.

Sorun şu ki, bildirimler tarafından iletilerle message.txt'ye yükseltilmiş değilim. Mesajlar ekranda görüntülenir, ancak mesajların message.txt içine yazılmasını istiyorum

Bunu nasıl yapabilirim?

RAISE LOG...Kullanmaya çalıştım ve mesajlar günlük dosyasına yazılıyor ... İstediğim bu değil.

İle bir işim var

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

ama ben \ o ve \ o plsql istemcisinde \ o içinde belirtilen dosyaya iletileri sahip nasıl kullanabilirsiniz bilmek istiyorum

İstemcim, cygwin üzerinde psql (PostgreSQL) 8.2.11 ve sunucu sürümü 9.0.7


1
Sorunun nedeni olmasa da, psgl 8.2'yi Pg 9.0'a karşı kullanmak, tüm sistem kataloğu şema değişiklikleri ve yeni sunucu özellikleri nedeniyle her türlü kedere neden olabilir. Tuhaf veya beklenmedik sorunlarla karşılaşırsanız, psql 9.x ile deneyin.
Craig Ringer

@CraigRinger Sorun cygwin için istemci psql kullanılabilir olmamasıdır. En azından son kez istemciyi cygwin'de yükseltmeye çalıştım. \ D işlevini kullanamıyorum ama her şey yolunda görünüyor.
Luc M

@CraigRinger İstemcinin artık desteklenmediğini bilmiyordum. Teşekkürler.
Luc M

Ben sadece iki kez kontrol etti; Ben düşündüm cygwin desteklenmeyen ve ben yaş için kullanmaktan kimse duymamıştı, ama insanlar hala içinde Cygwin PostgreSQL 9.2 beta inşa ediyoruz gibi görünüyor buildfarm ; bkz. brolga . İşe yaramalı. Muhtemelen mevcut Pg'yi istiyorsanız kaynaktan derlemeniz gerekecek, sadece korunmayan ikili Cygwin paketleri olacak. Gelecekteki karışıklıkları önlemek için bu yorumu sileceğim.
Craig Ringer

Soru hala devam ediyor: Neden Cygwin'i kullanıyorsunuz psql? libpqCygwin'de çalıştırılması gereken taşınabilir olmayan bir yazılımınız olup olmadığını anlayabiliyorum, ancak psqlWindows için yerel olarak kullanılabilir olduğunda , Cygwin'de eski bir sürümü çalıştırmanın cazibesi nedir?
Craig Ringer

Yanıtlar:


8

Korkarım bu cevabı beğenmeyeceksiniz, ama şu anda imkansız görünüyor. Gönderen psql'in belgelerinde :

Gelecekteki sorgu sonuçlarını dosya dosya adına kaydeder veya gelecekteki sonuçları komutu yürütmek için ayrı bir Unix kabuğuna bağlar. Herhangi bir bağımsız değişken belirtilmezse, sorgu çıktısı standart çıktıya sıfırlanır.

"Sorgu sonuçları", veritabanı sunucusundan alınan tüm tabloları, komut yanıtlarını ve bildirimleri ve veritabanını sorgulayan (\ d gibi) çeşitli ters eğik çizgi komutlarının çıktısını içerir, ancak hata iletilerini içermez.

Ve fark ettiğiniz gibi, psqletkileşimli kullanırken hata mesajlarını yeniden yönlendirmenin bir yolu yoktur .

(Ben boşuna \ o her yönlendirme her türlü oynuyordum. Sorgu çıkış kanalı hata iletileri alma bir farklı gibi görünüyor - ve hatta sunucudan hataları ve prosedürler yükseltilmiş farklı yollar gitmek gibi görünüyor .

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 içerir

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

Her iki durumda da. Bu nedenle, bir yordamdan iletilen iletilerin çıktısını almak için hangi kanal / dosya tanımlayıcısının kullanıldığından emin değilim.))

(PostgreSQL bilgisayar korsanlarında bu konuya ışık tutabilecek bir konu var: http://postgresql.1045698.n5.nabble.com/psql-output-locations-td5068313.html )

Ne bir olasılıkla yapabileceği başlayan olduğu psqlgibi

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

bu da tüm çıktıları belirtilen dosyaya yönlendirir. Bununla ilgili bir istemin olmadığı ve komut satırı düzenleme yeteneklerini kaybettiğiniz tek sorun.


1
Hayır, cevabını beğenmedim. :-)
Luc M

kanal / dosya tanımlayıcı, bir prosedürden alınan mesajların çıktısını almak için kullanılır : bu standart hatadır. \o | cat > out.sql 2>&1standart hatayı yeniden yönlendirir, catbir tanesini değil psql, bu nedenle bildirimler için bir faydası yoktur.
Daniel Vérité

@dezso, pgAdmin veya diğer GUI araçları NOTICEbilgileri nasıl görüntüler ?
Spike

@ Spike onlar üstüne inşa değildir psql, bu yüzden muhtemelen herhangi bir sorun olmadan.
dezso

@dezso, evet anladım. Ben belirledik, gibi bir sorunu var client_min_messageiçin debug(benim oturum içinde ve bazı dinamik SQLs çalıştırmak DO- hiçbir işlevi yaratmadan), bu psql'in ile vermeyerek pgAdmin içinde bildirim yükseltir. client_min_messageİfadeyi yürütmeden önce değeri yazdırdım DO. Gösteriliyor debug, ancak mesaj konsolda yazdırılmıyor.
Spike

2

\!Meta komutu kullanarak shell komutunu doğrudan psql'den yürütebiliriz .

localhost: 5432 kullanıcı @ db = # \! psql -U kullanıcı -h localhost your_database -e 'işlev_adınızı seçin ()'> debug.txt 2> & 1

açmak debug.txtile \e.

localhost: 5432 kullanıcı @ db = # \ e debug.txt

zam mesajı varsayılan düzenleyicinizde gösterilir. biraz zor, commandLine sevgilisi için hala oldukça kullanışlı.


0

Orijinal soruya bir çözüm değil, OP'nin geçici çözümüne ek olarak (benim için işe yaramadı)


Aşağıdaki zam ile elevTest.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;



Emin değilim, neden OP belirtildiği gibi bir dosyaya çıktı çalışmıyor, ama tee içine boru aslında işe yaradı:

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


Tee stdin'i bir veya daha fazla dosyaya yazar ve tekrar stdout'a yazar. Böylece konsolunuzda ve sağladığınız dosyalarda tüm RAISE ifadelerine sahip olursunuz. (bkz. tee'nin man sayfası )


Yapılandırma:

  • Postgres 8.4
  • Cygwin 2.0.2
  • tee 8.23

Soru, NOTICEetkileşimli bir oturumda ve kullanımdayken mesajların iletilmesini sağlamakla ilgiliydi\o
Luc M

Oh, tam ordasın. Bu bölümü tamamen kaçırdım, çünkü OP'deki geçici çözüm benim için çalışmadı ve sadece buna yoğunlaştım.
Baba Yığını
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.