log_statement
어떤 SQL statement를 log에 남길지 범주로 정합니다. 값은 none, ddl, mod, all 네 가지입니다.
값별 차이는 다음과 같습니다. none(기본값)은 statement logging을 하지 않습니다. ddl은 CREATE, ALTER, DROP 같은 데이터 정의 statement를 기록합니다. mod는 ddl에 해당하는 것에 더해 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_statement를 ERROR 이하로 설정해야 합니다.
운영 노트: 기록된 statement에는 민감한 데이터나 평문 비밀번호까지 그대로 노출될 수 있으므로 log 접근 통제가 전제되어야 합니다. 변경 이력 추적이 목적이라면 ddl이나 mod가 현실적이고, all은 log 볼륨과 오버헤드가 커서 상시 운영보다는 단기 조사용에 적합합니다. 실행 시간 기준 추적은 log_min_duration_statement를 병용합니다.
출처: PostgreSQL 18 문서