Làm thế nào để có được thông báo cho luồng đầu ra?


20

Tôi đã gỡ lỗi tin nhắn trong các chức năng. Những thông điệp được nêu lên như

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

Tôi đặt tệp nhật ký của mình với \o messages.txt

Sau đó, tôi làm những gì tôi cần làm với \i process.sql

Và khi việc thực hiện chấm dứt , \o.

Vấn đề là tôi không có các thông báo được đưa ra bởi các thông báo vào Messages.txt. Các tin nhắn được hiển thị trên màn hình nhưng tôi muốn chúng được viết bằng Messages.txt

Làm thế nào tôi có thể làm điều đó?

Tôi đã cố gắng sử dụng RAISE LOG...và tin nhắn được ghi trong tệp nhật ký ... Đó không phải là điều tôi muốn.

Tôi có một công việc xung quanh với

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

nhưng tôi muốn biết làm thế nào tôi có thể sử dụng \ i và \ o trên máy khách của mình có các thông điệp vào tệp được chỉ định trong \ o

Máy khách của tôi, trên cygwin là psql (PostgreSQL) 8.2.11 và phiên bản máy chủ là 9.0.7


1
Mặc dù không phải là nguyên nhân của vấn đề của bạn, nhưng việc sử dụng psql 8.2 chống lại PG 9.0 có thể khiến bạn đau buồn vì tất cả các thay đổi lược đồ danh mục hệ thống và các tính năng máy chủ mới. Nếu bạn gặp phải các vấn đề kỳ lạ hoặc bất ngờ, hãy thử với psql 9.x.
Craig Ringer

@CraigRinger Vấn đề là máy khách psql cho cygwin không khả dụng. Ít nhất là lần cuối cùng tôi cố gắng nâng cấp máy khách trên cygwin. Tôi không thể sử dụng chức năng \ d nhưng mọi thứ khác có vẻ ổn.
Luc M

@CraigRinger Không biết rằng máy khách không được hỗ trợ nữa. Cảm ơn.
Luc M

Tôi chỉ kiểm tra lại rằng; Tôi nghĩ rằng Cygwin không được hỗ trợ và tôi đã không nghe thấy bất cứ ai sử dụng nó từ lâu, nhưng có vẻ như mọi người vẫn đang xây dựng PostgreQuery 9.2 beta trên Cygwin trong bản dựng ; xem brolga . Nó nên hoạt động. Có lẽ bạn sẽ phải biên dịch từ nguồn nếu bạn muốn PG hiện tại, nó sẽ chỉ là các gói Cygwin nhị phân không được xác định. Tôi sẽ xóa bình luận đó để tránh mọi nhầm lẫn trong tương lai.
Craig Ringer

Câu hỏi vẫn còn: Tại sao sử dụng Cygwin cho psql? libpqTôi có thể hiểu nếu bạn có phần mềm không di động phải chạy trong Cygwin, nhưng khi nào psqlcó sẵn cho Windows thì sự hấp dẫn của việc chạy phiên bản cổ trên Cygwin là gì?
Craig Ringer

Câu trả lời:


8

Tôi sợ rằng bạn sẽ không thích câu trả lời này, nhưng hiện tại có vẻ như không thể. Từ tài liệu psql :

Lưu kết quả truy vấn trong tương lai vào tên tệp hoặc chuyển các kết quả trong tương lai vào một vỏ Unix riêng để thực thi lệnh. Nếu không có đối số được chỉ định, đầu ra truy vấn sẽ được đặt lại thành đầu ra tiêu chuẩn.

"Kết quả truy vấn" bao gồm tất cả các bảng, phản hồi lệnh và thông báo thu được từ máy chủ cơ sở dữ liệu, cũng như đầu ra của các lệnh dấu gạch chéo ngược khác nhau truy vấn cơ sở dữ liệu (như \ d), nhưng không phải là thông báo lỗi.

Và như bạn nhận thấy, không có cách nào chuyển hướng các thông báo lỗi khi sử dụng psqltương tác.

(Tôi đã chơi xung quanh với tất cả các loại chuyển hướng từ \ o thành vô ích. Có vẻ như kênh đầu ra truy vấn khác với kênh nhận thông báo lỗi - và thậm chí lỗi từ máy chủ và được nêu trong các quy trình của bạn đi theo các cách khác nhau .

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 chứa

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

trong cả hai trường hợp. Đây là lý do tại sao tôi không biết về mô tả kênh / tệp nào được sử dụng để xuất các thông báo được đưa ra từ một thủ tục.))

(Có một chủ đề về tin tặc PostgreSQL có thể làm sáng tỏ vấn đề này: http://postgresql.1045698.n5.nabble.com/psql-output-locations-td5068313.html )

Những gì người ta có thể làm là bắt đầu psqlnhư thế nào

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

và điều này sẽ chuyển hướng tất cả đầu ra đến tập tin được chỉ định. Vấn đề duy nhất với điều này là bạn thậm chí không có lời nhắc và mất khả năng chỉnh sửa dòng lệnh.


1
Không, tôi không thích câu trả lời của bạn. :-)
Luc M

bộ mô tả kênh / tệp được sử dụng để xuất các thông báo được đưa ra từ một quy trình : đó là lỗi tiêu chuẩn. \o | cat > out.sql 2>&1chuyển hướng lỗi tiêu chuẩn của catnhưng không phải là một trong số đó psql, vì vậy nó không được sử dụng cho các thông báo.
Daniel Vérité

@dezso, Làm thế nào pgAdmin hoặc bất kỳ công cụ GUI nào khác hiển thị NOTICEthông tin?
Spike

@Spike họ không được xây dựng trên đầu trang psql, vì vậy có lẽ không có vấn đề gì.
dezso

@dezso, vâng tôi hiểu rồi. Tôi có một vấn đề như thế, tôi đã đặt client_min_messageđể debugtrong phiên của tôi và chạy một số SQLs năng động với ( DO- mà không tạo ra bất kỳ chức năng), nó làm tăng thông báo trong pgAdmin bằng cách không với psql. Tôi đã in client_min_messagegiá trị trước khi thực hiện DOtuyên bố. Nó hiển thị debug, nhưng thông báo không được in trong bảng điều khiển.
Spike

2

Chúng ta có thể thực thi lệnh shell trực tiếp từ psql bằng \!lệnh meta.

localhost: 5432 người dùng @ db = # \! người dùng psql -U localhost your_database -e 'select your_feft_name ()'> debug.txt 2> & 1

mở debug.txtvới \e.

localhost: 5432 người dùng @ db = # \ e debug.txt

thông báo nâng cao sẽ được hiển thị trong trình chỉnh sửa mặc định của bạn. một chút khó khăn, vẫn còn khá tiện cho người yêu CommandLine.


0

Không phải là một giải pháp cho Câu hỏi ban đầu, mà là một bổ sung cho cách giải quyết của OP (không phù hợp với tôi)


Với những điều sau đây như growTest.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;



Tôi không chắc chắn, tại sao việc viết đầu ra vào một tệp như được ghi chú trong OP không hoạt động, nhưng việc chuyển nó thành tee thực sự hiệu quả:

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


Tee viết stdin vào một hoặc nhiều tệp và quay lại thiết bị xuất chuẩn. Vì vậy, bạn sẽ có tất cả các câu lệnh RAISE trong bảng điều khiển của bạn và trong (các) tệp bạn đã cung cấp. (xem trang người đàn ông của tee )


Cấu hình:

  • Postgres 8.4
  • Cygwin 2.0.2
  • tee 8,23

Câu hỏi là về việc đưa các tin nhắn được nêu ra NOTICEtrong khi bạn tham gia vào một phiên tương tác và sử dụng\o
Luc M

Oh, bạn đang ở đó. Tôi hoàn toàn bỏ lỡ phần đó, vì cách giải quyết trong OP không hiệu quả với tôi và tôi chỉ tập trung vào phần này.
Cha chồng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.