출력 스트림에 통지를 얻는 방법?


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

하지만 \ o에 지정된 파일에 메시지가있는 plsql 클라이언트에서 \ i 및 \ o를 사용하는 방법을 알고 싶습니다.

cygwin의 클라이언트는 psql (PostgreSQL) 8.2.11이고 서버 버전은 9.0.7입니다.


1
문제의 원인은 아니지만 Pg 9.0에 대해 psql 8.2를 사용하면 모든 시스템 카탈로그 스키마 변경 및 새로운 서버 기능으로 인해 모든 종류의 슬픔이 발생할 수 있습니다. 이상하거나 예기치 않은 문제가 발생하면 psql 9.x로 시도하십시오.
Craig Ringer

@CraigRinger 문제는 cygwin 용 클라이언트 psql을 사용할 수 없다는 것입니다. 적어도 마지막으로 cygwin에서 클라이언트를 업그레이드하려고했습니다. \ d 기능을 사용할 수는 없지만 다른 모든 기능은 정상적으로 보입니다.
Luc M

@CraigRinger 클라이언트가 더 이상 지원되지 않는다는 것을 몰랐습니다. 감사.
Luc M

나는 단지 그것을 두 번 확인했다. 나는 생각 Cygwin에서 지원되지 않는 있었고, 난 연령대에 그것을 사용하는 사람이 듣지했지만, 사람들은 여전히에서 Cygwin에서에 PostgreSQL의 9.2 베타를 구축하는 것 같습니다 buildfarm ; brolga 참조하십시오 . 작동해야합니다. 현재 Pg를 원한다면 소스에서 컴파일해야 할 것입니다. 유지되지 않은 바이너리 Cygwin 패키지 일뿐입니다. 나중에 혼란을 피하기 위해 해당 의견을 삭제하겠습니다.
Craig Ringer

문제는 여전히 남아 있습니다. 왜 Cygwin을 사용 psql합니까? libpqCygwin에서 실행해야하는 이식 불가능한 소프트웨어가 있는지 이해할 수 있지만 psqlWindows 용으로 기본 제공되는 시기 Cygwin에서 고대 버전을 실행하면 어떤 매력이 있습니까?
Craig Ringer

답변:


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
아니요, 당신의 대답이 마음에 들지 않습니다. :-)
Luc M

채널 / 파일 디스크립터는 프로 시저에서 발생하는 메시지를 출력하는 데 사용됩니다 . 표준 오류입니다. \o | cat > out.sql 2>&1의 표준 오류를 리디렉션 cat하지만의 오류는 리디렉션 하지 않으므로 psql알림에 사용되지 않습니다.
Daniel Vérité

@dezso, pgAdmin 또는 기타 GUI 도구는 어떻게 NOTICE정보를 표시 합니까?
스파이크

@Spike는 위에 빌드되지 않았으므로 문제가 없을 psql것입니다.
dezso

@dezso, 그래 알겠다. 내가 설정 한 같은 문제가 있어요 client_min_messagedebug(내 세션 내에서 일부 동적 SQL을 실행 DO- 어떤 기능을 만들지 않고), 그것은 psql의하지에 의해 pgAdmin 예고를 제기합니다. 명령문을 client_min_message실행하기 전에 값을 인쇄했습니다 DO. 이 표시 debug되지만 콘솔에서 메시지가 인쇄되지 않습니다.
스파이크

2

\!메타 명령을 사용하여 psql에서 직접 쉘 명령을 실행할 수 있습니다 .

로컬 호스트 : 5432 user @ db = # \! psql -U 사용자 -h localhost your_database -e 'select your_function_name ()'> debug.txt 2> & 1

열기 debug.txt와 함께 \e.

로컬 호스트 : 5432 user @ db = # \ e debug.txt

인상 메시지가 기본 편집기에 표시됩니다. 조금 까다 롭고 여전히 커맨드 라인 애호가에게 편리합니다.


0

원래 질문에 대한 해결책이 아니라 OP의 해결 방법에 대한 추가 사항 (나에게 도움이되지 않음)


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;



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의 해결 방법이 저에게 효과적이지 않아서 이것에만 집중했기 때문에 나는 그 부분을 완전히 놓쳤습니다.
Father Stack
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.