Как получить уведомления в выходной поток?


20

У меня есть отладочные сообщения в функциях. Эти сообщения поднимаются как

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

Я установил свой лог-файл с \o messages.txt

Тогда я делаю то, что мне нужно сделать с \i process.sql

И когда исполнение прекращается \o.

Проблема в том, что у меня нет сообщений, поднятых уведомлениями в messages.txt. Сообщения отображаются на экране, но я хочу, чтобы они были записаны в messages.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 может вызвать у вас всевозможные страдания из-за всех изменений схемы системного каталога и новых функций сервера. Если вы столкнулись со странными или неожиданными проблемами, попробуйте psql 9.x.
Крейг Рингер

@CraigRinger Проблема в том, что клиент PSQL для Cygwin недоступен. По крайней мере, в прошлый раз я пытался обновить клиент на Cygwin. Я не могу использовать функциональность \ d, но все остальное кажется нормальным.
Люк М

@CraigRinger Не знал, что клиент больше не поддерживается. Благодарю.
Люк М

Я просто дважды проверил это; Я думал, что Cygwin не поддерживается, и я не слышал, чтобы кто-то использовал его целую вечность, но похоже, что люди все еще собирают бета-версию PostgreSQL 9.2 на Cygwin в buildfarm ; см бролга . Он должен работать. Вы, вероятно, просто должны будете скомпилировать из исходного кода, если вам нужен текущий Pg, это будут просто двоичные пакеты Cygwin, которые не поддерживаются. Я удалю этот комментарий, чтобы избежать путаницы в будущем.
Крейг Рингер

Однако остается вопрос: зачем использовать Cygwin для psql? libpqЯ мог бы понять, если у вас есть непереносимое программное обеспечение, которое должно работать в Cygwin, но когда psqlоно доступно изначально для Windows, в чем смысл использовать древнюю версию Cygwin?
Крейг Рингер

Ответы:


8

Боюсь, вам не понравится этот ответ, но в настоящее время он кажется невозможным. Из документации PSQL :

Сохраняет будущие результаты запроса в файле с именем файла или передает будущие результаты в отдельную оболочку Unix для выполнения команды. Если аргументы не указаны, вывод запроса будет сброшен до стандартного вывода.

«Результаты запроса» включают в себя все таблицы, ответы на команды и уведомления, полученные от сервера базы данных, а также вывод различных команд обратной косой черты, которые запрашивают базу данных (например, \ 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

и это перенаправит весь вывод в указанный файл. Единственная проблема с этим, что у вас даже нет приглашения, и вы теряете возможности редактирования командной строки.


1
Нет, мне не нравится твой ответ. :-)
Люк М

дескриптор канала / файла используется для вывода сообщений, вызванных процедурой : это стандартная ошибка. \o | cat > out.sql 2>&1перенаправляет стандартную ошибку, catно не одну из psql, так что это бесполезно для уведомлений.
Даниэль Верите

@dezso, как pgAdmin или любые другие инструменты GUI отображают NOTICEинформацию?
Спайк

@Spike они не надстраиваются psql, так что, вероятно, без проблем.
Дезсо

@ dezso, да, я понял. У меня вопрос , как, я поставил client_min_messageв debugрамках моей сессии и запустить некоторую динамическую SQLs с ( DO- без создания какой - либо функции), она поднимает уведомление pgAdmin, не с PSQL. Я напечатал client_min_messageзначение перед выполнением DOоператора. Это показывает debug, но сообщение не печатается в консоли.
Спайк

2

Мы можем выполнить команду оболочки напрямую из psql, используя \!команду meta.

localhost: 5432 пользователь @ db = # \! psql -U пользователь -h localhost your_database -e 'select your_function_name ()'> debug.txt 2> & 1

открыть debug.txtс \e.

localhost: 5432 пользователь @ db = # \ e debug.txt

поднять сообщение будет показано в вашем редакторе по умолчанию. немного хитрый, все еще весьма удобный для любителя CommandLine.


0

Не решение исходного вопроса, а дополнение к обходному пути ОП (который не работал для меня)


Со следующим как RaiseTest.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;



Я не уверен, почему записи вывода в файл , как указано в ОП не работает, но обжигающе его в тройник фактически выработанного:

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


Ти записывает стандартный ввод в один или несколько файлов и обратно в стандартный вывод. Таким образом, вы будете иметь все операторы RAISE в своей консоли и в предоставленных вами файлах. (см. справочную страницу Ти )


Конфигурация:

  • Postgres 8,4
  • Cygwin 2.0.2
  • тройник 8,23

Вопрос был в том, чтобы получать сообщения, поднятые NOTICEво время интерактивного сеанса и использования\o
Luc M

О, ты здесь. Я полностью пропустил эту часть, так как обходной путь в OP не работал для меня, и я сосредоточился только на этом.
Отец Стек
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.