본문으로 건너뛰기

log_statement

버전기본값context타입
14nonesuperuserenum
15nonesuperuserenum
16nonesuperuserenum
17nonesuperuserenum
18nonesuperuserenum
19nonesuperuserenum

어떤 SQL statement를 log에 남길지 범주로 정한다. 값은 none, ddl, mod, all 네 가지다.

값별 차이는 다음과 같다. none(기본값)은 statement logging을 하지 않는다. ddlCREATE, ALTER, DROP 같은 데이터 정의 statement를 기록한다. modddl에 해당하는 것에 더해 INSERT, UPDATE, DELETE, TRUNCATE, COPY FROM 같은 데이터 변경 statement까지 기록한다. all은 모든 statement를 기록한다. PREPARE, EXECUTE, EXPLAIN ANALYZE는 그 안에 담긴 명령이 해당 범주에 속하면 함께 기록된다. extended query protocol을 쓰는 클라이언트는 Execute 메시지가 도착한 시점에 기록되며, bind parameter 값도 포함된다(내부의 작은따옴표는 두 개로 이중화).

한 가지 함정이 있다. 단순 문법 오류가 있는 statement는 all로 설정해도 기록되지 않는다. log 메시지는 statement의 유형을 판별하는 기본 파싱이 끝난 뒤에야 출력되기 때문이다. extended query protocol에서도 Execute 단계 이전(구문 분석이나 계획 수립 중)에 실패한 statement는 남지 않는다. 이런 실패 statement까지 잡으려면 log_min_error_statementERROR 이하로 설정해야 한다.

운영 노트: 기록된 statement에는 민감한 데이터나 평문 비밀번호까지 그대로 노출될 수 있으므로 log 접근 통제가 전제되어야 한다. 변경 이력 추적이 목적이라면 ddl이나 mod가 현실적이고, all은 log 볼륨과 오버헤드가 커서 상시 운영보다는 단기 조사용에 적합하다. 실행 시간 기준 추적은 log_min_duration_statement를 병용한다.

출처: PostgreSQL 18 문서