จะรับการแจ้งเตือนไปยังสตรีมเอาต์พุตได้อย่างไร


20

ฉันมีข้อความดีบั๊กในฟังก์ชั่น ข้อความเหล่านั้นถูกยกขึ้นเช่น

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

ฉันตั้งค่าไฟล์บันทึกด้วย \o messages.txt

จากนั้นฉันทำสิ่งที่ฉันต้องทำ \i process.sql

\oและเมื่อการดำเนินการถูกยกเลิก

ปัญหาคือฉันไม่มีข้อความที่เพิ่มขึ้นโดยการแจ้งเตือนลงใน messages.txt ข้อความปรากฏบนหน้าจอ แต่ฉันต้องการให้เขียนเป็นข้อความในข้อความ.txt

ฉันจะทำสิ่งนั้นได้อย่างไร

ฉันพยายามใช้RAISE LOG...และข้อความเขียนในล็อกไฟล์ ... ไม่ใช่สิ่งที่ฉันต้องการ

ฉันมีงานทำด้วย

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

แต่ฉันอยากจะรู้ว่าฉันสามารถใช้ \ i และ \ o บนไคลเอนต์ plsql ที่มีข้อความเป็นไฟล์ที่ระบุใน \ o

ลูกค้าของฉันใน cygwin คือ psql (PostgreSQL) 8.2.11 และรุ่นเซิร์ฟเวอร์คือ 9.0.7


1
แม้ว่าจะไม่ใช่สาเหตุของปัญหาของคุณการใช้ psql 8.2 เทียบกับ Pg 9.0 อาจทำให้คุณโศกเศร้าทุกประเภทเนื่องจากการเปลี่ยนแปลง schema แค็ตตาล็อกระบบและคุณลักษณะเซิร์ฟเวอร์ใหม่ หากคุณพบปัญหาแปลก ๆ หรือไม่คาดคิดลองใช้ psql 9.x
Craig Ringer

@CraigRinger ปัญหาคือไคลเอนต์ psql สำหรับ cygwin ไม่พร้อมใช้งาน อย่างน้อยครั้งสุดท้ายที่ฉันพยายามอัพเกรดลูกค้าบน cygwin ฉันไม่สามารถใช้ฟังก์ชั่น \ d ได้ แต่ทุกอย่างดูโอเค
Luc M

@CraigRinger ไม่ทราบว่าลูกค้าไม่ได้รับการสนับสนุนอีกต่อไป ขอบคุณ
Luc M

ฉันแค่ตรวจสอบสองครั้งว่า; ฉันคิดว่า cygwin ไม่ได้รับการสนับสนุนและฉันไม่เคยได้ยินใครใช้มันมานาน แต่ดูเหมือนว่าผู้คนยังคงสร้าง PostgreSQL 9.2 เบต้าบน Cygwin ในbuildfarm ; ดูBrolga มันควรจะทำงาน คุณอาจจะต้องรวบรวมจากแหล่งที่มาถ้าคุณต้องการ Pg ปัจจุบันมันจะเป็นแพ็คเกจ Cygwin ไบนารีที่ไม่มีการระบาย ฉันจะลบความคิดเห็นนั้นเพื่อหลีกเลี่ยงความสับสนในอนาคต
Craig Ringer

คำถามยังคงอยู่: ทำไมใช้ Cygwin เพื่อpsql? libpqฉันสามารถเข้าใจได้ว่าคุณมีซอฟต์แวร์ที่ไม่ใช่พกพาที่ต้องทำงานใน Cygwin แต่เมื่อใดที่psqlมีให้ใช้งานได้จริงสำหรับ Windows สิ่งที่น่าดึงดูดของการใช้งานรุ่นโบราณใน Cygwin คืออะไร
Craig Ringer

คำตอบ:


8

ฉันกลัวว่าคุณจะไม่ชอบคำตอบนี้ แต่ดูเหมือนว่าเป็นไปไม่ได้ จากเอกสาร psql :

บันทึกผลลัพธ์การสืบค้นในอนาคตไปยังชื่อไฟล์หรือไพพ์ผลลัพธ์ในอนาคตลงใน Unix shell แยกเพื่อเรียกใช้งานคำสั่ง หากไม่มีการระบุอาร์กิวเมนต์เอาต์พุตเคียวรีจะถูกรีเซ็ตเป็นเอาต์พุตมาตรฐาน

"ผลลัพธ์แบบสอบถาม" รวมถึงตารางคำตอบคำสั่งและประกาศทั้งหมดที่ได้รับจากเซิร์ฟเวอร์ฐานข้อมูลรวมถึงเอาต์พุตของคำสั่งแบ็กสแลชต่างๆที่สอบถามฐานข้อมูล (เช่น \ d) แต่ไม่ใช่ข้อความแสดงข้อผิดพลาด

และอย่างที่คุณสังเกตเห็นไม่มีทางเปลี่ยนเส้นทางข้อความข้อผิดพลาดเมื่อใช้psqlแบบโต้ตอบ

(ฉันได้รับการเล่นกับการเปลี่ยนเส้นทางทุกชนิดจาก \ o ไปยังไม่มีประโยชน์ดูเหมือนว่าช่องสัญญาณออกแบบสอบถามแตกต่างจากที่ได้รับข้อความแสดงข้อผิดพลาด - และแม้แต่ข้อผิดพลาดจากเซิร์ฟเวอร์และวิธีการที่แตกต่างกันไป .

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 มี

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

ในทั้งสองกรณี. นี่คือเหตุผลที่ฉันไม่รู้เรื่องเกี่ยวกับสิ่งที่อธิบายถึงช่อง / ไฟล์ที่ใช้สำหรับการแสดงผลข้อความที่เพิ่มขึ้นจากกระบวนการ)

(มีเธรดเกี่ยวกับ PostgreSQL แฮกเกอร์ที่อาจทำให้เข้าใจถึงปัญหานี้: http://postgresql.1045698.n5.nabble.com/psql-output-locations-td5068313.html )

สิ่งหนึ่งที่สามารถทำได้คือเริ่มต้นpsqlเช่น

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

และนี่จะเปลี่ยนเส้นทางเอาต์พุตทั้งหมดไปยังไฟล์ที่ระบุ ปัญหาเดียวของสิ่งนี้ที่คุณไม่มีแม้กระทั่งพรอมต์และสูญเสียความสามารถในการแก้ไข commandline


1
ไม่ฉันไม่ชอบคำตอบของคุณ :-)
Luc M

ตัวอธิบายช่อง / ไฟล์ใช้สำหรับแสดงข้อความที่เพิ่มขึ้นจากโพรซีเดอร์ : เป็นข้อผิดพลาดมาตรฐาน \o | cat > out.sql 2>&1เปลี่ยนเส้นทางข้อผิดพลาดมาตรฐานของcatแต่ไม่ใช่ของข้อใดข้อหนึ่งpsqlดังนั้นจึงไม่มีประโยชน์สำหรับการแจ้งเตือน
Daniel Vérité

@dezso, pgAdmin หรือเครื่องมือ GUI อื่น ๆ แสดงNOTICEข้อมูลอย่างไร?
ขัดขวาง

@ เข็มพวกเขาไม่ได้สร้างขึ้นpsqlมาดังนั้นอาจไม่มีปัญหาใด ๆ
dezso

@dezso ใช่ฉันเข้าใจแล้ว ผมได้มีปัญหาเหมือนเราได้ตั้งไว้client_min_messageเพื่อdebugภายในเซสชันของฉันและรัน SQLs แบบไดนามิกบางคนที่มี ( DO- โดยไม่ต้องสร้างฟังก์ชั่นใด ๆ ) มันจะเพิ่มการแจ้งให้ทราบใน pgAdmin โดยไม่ได้กับ psql ฉันพิมพ์client_min_messageค่าก่อนดำเนินการDOคำสั่ง มันแสดงให้เห็นdebugแต่ข้อความไม่ได้พิมพ์ในคอนโซล
ขัดขวาง

2

เราสามารถรันคำสั่งเชลล์โดยตรงจาก psql โดยใช้\!คำสั่ง meta

localhost: 5432 ผู้ใช้ @ db = # \! psql -U user -h localhost your_database -e 'select your_function_name ()'> debug.txt 2> & 1

เปิดด้วยdebug.txt\e

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

ข้อความเพิ่มจะปรากฏในเครื่องมือแก้ไขเริ่มต้นของคุณ ค่อนข้างยุ่งยาก แต่ก็ค่อนข้างมีประโยชน์สำหรับคนรักคำสั่ง


0

ไม่ใช่วิธีแก้ปัญหาสำหรับคำถามต้นฉบับ แต่เป็นการเพิ่มวิธีแก้ปัญหาของ OP (ซึ่งไม่ได้ผลสำหรับฉัน)


ด้วยดังต่อไปนี้เป็น RaTest.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;



ฉันไม่แน่ใจว่าทำไมการเขียนผลลัพธ์ไปยังไฟล์อย่างที่บันทึกไว้ใน OP ไม่ทำงาน แต่การไพพ์ลงในทีก็ทำงานได้จริง:

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


Tee เขียน stdin ลงในไฟล์หนึ่งไฟล์ขึ้นไปและกลับสู่ stdout ดังนั้นคุณจะมีคำสั่ง RAISE ทั้งหมดในคอนโซลของคุณและในไฟล์ที่คุณให้ไว้ ( หน้าคนของทีออฟ )


การกำหนดค่า:

  • Postgres 8.4
  • Cygwin 2.0.2
  • ที 8.23

คำถามคือเกี่ยวกับการรับข้อความที่เพิ่มขึ้นNOTICEในขณะที่คุณเข้าสู่เซสชันและการใช้งานแบบโต้ตอบ\o
Luc M

โอ้คุณอยู่ตรงนั้น ฉันพลาดส่วนนั้นไปทั้งหมดเนื่องจากการแก้ปัญหาใน OP ไม่ได้ผลสำหรับฉันและฉันจึงสนใจ แต่เพียงอย่างเดียว
สแต็คพ่อ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.