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 reloadservice 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_messageslog_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.