PostgreSQL 쿼리를 기록하는 방법?


372

PostgreSQL 8.3이 실행하는 모든 SQL의 로깅을 활성화하는 방법은 무엇입니까?

편집 (추가 정보) 다음 줄을 변경했습니다.

log_directory = 'pg_log'                    
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_statement = 'all'

그리고 PostgreSQL 서비스를 다시 시작하십시오 ...하지만 로그가 생성되지 않았습니다 ... Windows Server 2003을 사용하고 있습니다.

어떤 아이디어?


15
이것은 중요하다 :logging_collector = on
— bonyiii

또한 일부 GNU / Linux 배포판 (예 : Debian Jessie) systemctl restart postgresql에서는 실제로 구성한 PostgreSQL 서비스가 실제로 다시 시작되지 않을 수 있으므로 (아직 이유를 이해하지 못함) 구성 파일의 변경 사항이 적용되지 않습니다. 사용하는 것이 더 안전합니다 pg_ctl(또는 pg_ctlcluster데비안에서).
— Skippy le Grand Gourou

4
난 그냥 PostgreSQL을 9.5, 우분투 16.04 LTS에서이 테스트를하고 systemctl reload postgresql, systemctl restart postgresql, service postgresql reload및 service postgresql restart모든 구성 변경 사항이 적용 렌더링합니다.
— 벤 존슨

답변:


464

당신의에서 data/postgresql.conf파일의 변경 log_statement에 대한 설정을 'all'.


편집하다

새 정보를 살펴보면 확인해야 할 몇 가지 다른 설정이있을 수 있습니다.

  • log_destination변수를 켰는 지 확인하십시오
  • 당신이 켜져 있는지 확인 logging_collector
  • 또한 log_directory디렉토리가 디렉토리 내에 이미 존재 data하고 postgres 사용자 가 디렉토리에 쓸 수 있는지 확인하십시오 .

3
궁금한 점은 서버를 다시 시작하지 않으면 PostgreSQL이 로깅을 사용할 수 없다는 것을 의미합니까? MySQL에서는 "SET GLOBAL general_log = 'ON';"만큼 간단합니다.
— Antony

7
MySQL과 같은 SQL 문을 사용하여 수행하는 방법이 있는지는 모르겠지만 실행중인 서버에 구성을 다시로드하는 명령을 보낼 수 있습니다.pg_ctl reload
— Jarret Hardie

9
PostgreSQL에는 SQL 문을 통해 매개 변수를 아직 변경할 수있는 방법이 없습니다 (9.2 현재). 대부분의 로깅 매개 변수는 전체 서버를 다시 시작하지 않고 pg_ctl reload를 대신 수행하여 변경할 수 있습니다. 그러나 logging_collector를 변경하려면 다시 시작해야합니다.
— Greg Smith

6
Postgres 9.4 및 새로운 ALTER SYSTEM명령으로 수퍼 유저는 SQL에서 GUC 매개 변수를 설정할 수 있습니다.
— Erwin Brandstetter

6
data대답에 인용 된 디렉토리는 문자 그대로 이름이 아닙니다; data_directoryPostgreSQL 구성 파일에서 변수에 지정된 경로를 나타냅니다 . 데비안과 우분투 GNU / 리눅스에서이 파일은 일반적으로 존재하는 /etc/postgresql/$v/main/postgresql.conf경우, $v서버 버전입니다. 또한 앞에서 언급 한 시스템에서 log_destination = 'stderr', 출력은 서버 버전이 /var/log/postgresql/postgresql-$v-main.log어디 $v(내부 위치가 아닌 data_directory)에 기록됩니다.
— 벤 존슨

104

를 수정 /etc/postgresql/9.3/main/postgresql.conf하고 다음과 같이 줄을 변경하십시오.

참고 : postgresql.conf파일을 찾지 못하면 $locate postgresql.conf터미널을 입력하십시오 .

  1. #log_directory = 'pg_log' 에 log_directory = 'pg_log'

  2. #log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' 에 log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'

  3. #log_statement = 'none' 에 log_statement = 'all'

  4. #logging_collector = off 에 logging_collector = on

  5. 선택 사항 :SELECT set_config('log_statement', 'all', true);

  6. sudo /etc/init.d/postgresql restart 또는 sudo service postgresql restart

  7. postgresql의 화재 쿼리 select 2+2

  8. 현재 로그인 찾기 /var/lib/pgsql/9.2/data/pg_log/

로그 파일은 시간이 지남에 따라 많이 커져서 시스템을 죽일 수 있습니다. 안전을 위해 로그를 삭제하고 postgresql 서버를 다시 시작하는 bash 스크립트를 작성하십시오.

감사합니다 @paul, @Jarret Hardie, @ Zoltán, @Rix Beck, @Latif Premani


2
데비안 스트레치에서, 나는 # log_destination = 'stderr'이것이 작동하기 전에 구성 파일에서 주석을 해제 해야했습니다.
— phihag

나는 당신의 발걸음을 조심스럽게 따르고 작동하지 않습니다. 다시 시작해야합니까?
— Yohanes AI

2
bash 스크립트를 작성하지 않고 로그를 매월 덮어 쓰려면 다음 log_filename = 'postgresql-%d.log'과 같이하십시오. 다시 시작할 때마다 덮어 쓰지 않으면 매일 추가되고 매월 덮어 씁니다. 물론 월 28,29,30,31에 따라 다른 날이 있지만 아이디어를 얻습니다.
— sojim2

44
SELECT set_config('log_statement', 'all', true);

해당 사용자 권한으로 연결 후 위의 쿼리를 사용할 수 있습니다. 세션이 끝날 때까지 로깅에 영향을줍니다.


7
일반적으로 SET log_statement = 'all'또는 (트랜잭션 레벨) 을 사용하는 것이 더 깨끗합니다 SET LOCAL log_statement = 'all'. client_min_messages및 log_min_messages설정에 관심이있을 수도 있습니다 .
— Craig Ringer

1
연결 메시지 만 기록하고 싶기 때문에 이것은 훌륭합니다. 불행히도 나는 : permission denied to set parameter "log_statement"사용자가 수퍼 유저가 아니기 때문에 얻는다 .
— guettli

3
DB 관리자에게 기능 실행 권한을 요청할 수 있습니다. GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON { FUNCTION function_name ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) [, ...] | ALL FUNCTIONS IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
— Rix Beck

35

PostgreSQL에 다음 줄을 추가하고 서버를 다시 시작해야합니다.

log_directory = 'pg_log'                    
log_filename = 'postgresql-dateformat.log'
log_statement = 'all'
logging_collector = on

2
logging_collector = on이 필요합니다
— wjin

매력처럼 작동합니다. Required to be on for csvlogs이 옵션이 명령문뿐만 아니라 쿼리 출력을 기록하는 것이라고 생각 하는 구성 파일에 대한 의견에 혼란 스러웠지만 실제로는 그렇지 않습니다.
— Jacopofar

data / postgresql.conf 파일에서 log_statement 설정을 'all'로 변경하십시오.
— FlyingV

32

참고 : 다른 솔루션은 기본 데이터베이스의 문만 기록하며 일반적으로 postgres다른 사람은 기록합니다. 그들의 해결책으로 시작하십시오. 그때:

ALTER DATABASE your_database_name
SET log_statement = 'all';

참조 : https://serverfault.com/a/376888 /log_statement



20

위의 답변에 +1 다음 구성을 사용합니다

log_line_prefix = '%t %c %u ' # time sessionid user
log_statement = 'all'

10

이 웹 페이지 에있는 지침에 따라 PostgreSQL 9.2를 실행하는 CentOS 6.4 (Red Hat 4.4.7-3)에 대한 자세한 내용을 보려면 :

  1. 에서 (설명 해제) log_statement = 'all'및 log_min_error_statement = error로 설정하십시오 /var/lib/pgsql/9.2/data/postgresql.conf.
  2. PostgreSQL 구성을 다시로드하십시오. 나를 위해 이것은을 실행하여 수행되었습니다 /usr/pgsql-9.2/bin/pg_ctl reload -D /var/lib/pgsql/9.2/data/.
  3. 오늘의 로그인 찾기 /var/lib/pgsql/9.2/data/pg_log/

4
다시 시작할 필요가 없습니다. a pg_ctl reload는 충분하며 연결을 방해하지 않습니다. 이 답변이 이미 여기에있는 사람들에게 무엇이든 추가한다고 확신하지 못합니다.
— 크레이그 벨소리

1
@CraigRinger 댓글 주셔서 감사합니다, 그것은 매우 중요한 사실입니다. 제안을 시도하면 답변을 업데이트하겠습니다. 나는 유닉스에 대한 경험이 거의 없었기 때문에 필요한 답을 한곳에 (예 : postgresql.conf와 로그 파일의 위치) 갖고 싶었 기 때문에이 답변을 주로 참고 용으로 작성했습니다.
— Zoltán

0

또한 모든 매개 변수를 기록하도록이 매개 변수를 설정해야합니다.

log_min_duration_statement = 0

0

log_statement일부 postgres 구성 파일에서 설정을 시도 했지만 실제로 postgres에서 파일을 읽지 못했습니다.

요청을 사용하여 다음을 확인했습니다.

select *
from pg_settings

[...]
log_statement   none # That was not the value i was expected for !!!

나는이 방법을 사용합니다 https : //.com/a/41912295/2294168

command: postgres -c config_file=/etc/postgresql.conf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.