Як отримати повідомлення до вихідного потоку?


20

У мене є функції налагодження у функціях. Ці повідомлення піднімаються як би

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

Я встановив свій файл журналу за допомогою \o messages.txt

Тоді я роблю те, що мені потрібно робити \i process.sql

І коли виконання завершується, \o.

Проблема полягає в тому, що у мене немає повідомлень, піднятих повідомленнями, в messages.txt. Повідомлення відображаються на екрані, але я хочу, щоб вони були записані у message.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 або будь-який інший інструмент графічного інтерфейсу відображає NOTICEінформацію?
Спайк

@Spike вони не будуються на вершині psql, тому, ймовірно, без проблем.
dezso

@dezso, так, я розумію. У мене виникла така проблема, як я налаштував client_min_messageв debugрамках свого сеансу і запустив деякі динамічні sqls з ( DO- не створюючи жодної функції), він викликає повідомлення в pgAdmin не з psql. Я надрукував client_min_messageзначення перед виконанням DOоператора. Він показує debug, але повідомлення не друкується в консолі.
Спайк

2

Ми можемо виконати команду оболонки безпосередньо з psql за допомогою \!мета-команди.

localhost: 5432 користувач @ db = # \! psql -U користувач -h localhost your_database -e 'вибрати your_function_name ()'> debug.txt 2> & 1

відкрити debug.txtс \e.

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

повідомлення про підвищення відображатиметься у вашому редакторі за замовчуванням. трохи хитро, але все ще досить зручно для любителя commandLine.


0

Не рішення оригінального питання, а доповнення до вирішення проблеми ОП (яке не працювало для мене)


З наступним, як підвищити

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


Ти записує stdin в один або кілька файлів і повертається в stdout. Таким чином, у вас буде всі заяви RAISE на консолі та у наданому вами файлі. (пор . сторінка чоловіка трійника )


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

  • Постгрес 8.4
  • Cygwin 2.0.2
  • трійник 8.23

Питання полягало в тому, щоб підняти повідомлення під NOTICEчас інтерактивного сеансу та використовувати його\o
Luc M

Ой, ти прямо там. Я цілком пропустив цю частину, оскільки врегулювання в ОП не працювало для мене, і я сконцентрувався лише на цьому.
Батько Стек
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.