2012-07-12 2 views
3

여기에 문제가 있습니다. 실행 한 .sql 스크립트의 모든 PostgreSQL 출력을 오류 및 쿼리 결과를 포함하여 파일에 기록하는 방법을 알아야합니다..sql 스크립트에 대한 PostgreSQL 쿼리/오류 로깅

나는 이미 \ o 및 \ o 개폐 태그로 스크립트를 둘러 쌌지 만 쿼리의 결과 만 기록하기 때문에 어떤 결과가 성공하지 못했는지 아무 것도 알려주지 않습니다. 그래서 같은 유닉스 도구를 사용하여 PostgreSQL을에 대한 호출의 결과를 파이프 시도했다 :

$~: psql < filename.sql | tee &> filename.log 

을 ... 아니 성공. 이 경우 Filename.log는 완전히 비어있게됩니다.

나는 필자가 작성한 스크립트의 성공/실패에만 관심이 있고 이후의 참조를 위해이 기록을 유지하기 때문에 유니버설 로깅을 활성화하고 싶지 않습니다.

오라클에서는 SPOOL을 사용했으며, MySQL에서는 TEE를 사용했습니다. 이 두 가지 모두 내 필요에 맞게 잘 작동하지만 \ o에는이 기능이 없으며 하나의 파일에 로깅하고 어떤 파일로 인해 로그가 생성되었는지에 따라 로그가 분리되기 때문에 로깅을 활성화하지도 않습니다.

도움을 주시면 감사하겠습니다.

편집 : 내가 사용하고있는 버전은 9.1

편집이다 : 나는 데 문제가 -f 사용 .SQL 파일을 실행 <를 사용하는 것은 본질적으로 동일한 결과 저를 준다이다; 그것은 오류를 기록하지 않고 쿼리 결과 만 기록합니다. 필자는 stderr (사용되는 경우)를 사용하여 명령 줄뿐만 아니라 파일에 메시지를 출력하여 파일이 본질적으로 쿼리 결과 및 오류가있는 파일을 실행하는 명령 줄 결과와 똑같이 보일 수 있도록해야합니다. in.이 작업을 수행해야하는 이유는 .sql 파일 디버깅이 훨씬 쉬워지고 범용 오류 로깅을 피하면서 대상 지정 된 레코드를 유지할 수 있기 때문입니다.

답변

6

명령 줄에서 잘못된 리디렉션 구문을 사용하고있었습니다. 이것은 내 생각에 이상적인 솔루션은 아니지만 (출력을 파일로 리디렉션하기 위해 실행 한 명령을 수정해야한다는 것을 기억해야합니다), 작동하며, 그것이 내가 아끼지 않는 전부입니다. 로 (-f : 여기

psql -f scriptname.sql &> logname.txt 

가 고장입니다 :

하나는 다음 작업을 수행 할 수 있습니다, 오류 및 쿼리를 포함하는 하나의 .SQL 파일의 결과를 로그 파일에 표준 출력 및 표준 오류 모두를 리디렉션하려면 Frank Heikens의 답변에서 언급 한 내용)은 오류를 유발 한 행 번호를 표시하기 때문에 .sql 스크립트를 읽는 데 <보다 나은 명령입니다. &>은 stdout과 stderr를 뒤 따르는 파일에 넣는 Linux 명령 행법입니다. 로그를 오류 (단지 sdterr 출력)로 제한하려면 &> 대신 2>를 사용하십시오. 두 스트림이 같은 위치로 이동하기 때문에 파이프가 필요 없습니다.

위의 명령은 명령의 모든 출력을 파일에 저장하므로 명령 줄에 해당 출력이 표시되지 않습니다. 이것은 디버깅에 이상적이지 않습니다.SQL 스크립트, 그래서 다음과 같은 명령을 대신 사용할 수 있습니다

psql -f scriptname.sql 2>&1 | tee logname.txt 

여기 고장은 2> & 1> &의 긴 형식이지만, 파이프로 작업 할 때, 2> & 1 BASH 통역을 피할 수 있다는 것입니다 오류로 구문 (왜 나에게 물어 보지 마). tee는 단순히 콘솔과 주어진 파일 모두에 출력을 허용합니다. 위의 모든 명령의 파일 이름은 전체 경로 일 수 있으며, ~ (홈 디렉토리의 경우) 및 Linux가 유효한 파일 이름 및/또는 경로로 해석 할 수있는 모든 항목을 포함 할 수 있습니다.

여전히이 솔루션은 로그해야하는 .sql 스크립트의 외부이므로 이상적이지 않습니다. 그러나이 방법이 효과적입니다. 필자는 PostgreSQL이 Linux와 함께 수행 한 역사가 부분적으로 이런 종류의 일을 수행하는 명령 행 도구에 의존하고 있다고 생각합니다.

+0

감사! 이것은 정확히 내가 찾던 해답과 함께 갈 설명입니다. 다시 한 번 감사드립니다! –

0

-f (및 기타 설정)를 사용하여 psql을 입력하십시오.

+0

을 보여줍니다 --help

psql -f scriptname.sql -a -b -e &> logname.text 

psql 프로그램을 왜냐하면 그것은 오류를 유발 한 행 번호를 제공하기 때문에 이기 때문에 여전히 오류 출력을 파일에 넣지는 못합니다. 나는 링크에서 -L, -o, \ o 및 몇 가지 다른 것을 시도했지만 아무도 원하는 결과를 얻지 못했습니다 (오류 출력 및 쿼리 결과는 로깅 목적을 위해 파일로 퍼널됩니다). – Adam

1

이 또한 작동 -에 -a -b와 "자세한 로깅 :"에 대한 -e 옵션 사용 :이 좋은 방법이지만 (

Input and output options: 
    -a, --echo-all   echo all input from script 
    -b, --echo-errors  echo failed commands 
    -e, --echo-queries  echo commands sent to server