[ PostgreSQL ] postgresql 로그
postgresql 에서 사용하는 log 들에 대해서 알아보자.
# PostgreSQL log 종류
1) WAL (write ahead log) log
트랜잭션의 모든 변경 사항을 기록하는 로그 파일. 기본적으로 16MB 세그먼트 파일. pg_wal 디렉터리에 저장된다.
관련파라미터 : min_wal_size, max_wal_size
2) Archived wal log
WAL 파일을 안전하게 보관하기 위해 아카이브한 파일들. PITR(Point-In-Time Recovery)와 백업 복구에 활용된다.
관련파라미터 : wal_keep_size
3) postgresql log
쿼리 실행, 에러, 경고, audit, 접속 정보 등 서버 동작과 관련된 일반 로그.
mysql 과 달리 slow 쿼리가 분리되어 기록되지 않고 postgresql.log 에 저장됨 (기준 : log_min_duration_statement )
postgresql.conf의 log_destination, logging_collector 등의 설정에 의해 생성 및 관리
log_statement
log_min_duration_statement
pgaudit.log
4) clog (commit log)
트랜잭션의 커밋 상태를 shared memeory 영역에 저장.
이부분은 수동 관리가 불가
# 클라이언트에서 로그 확인하기
postgresql.log 는 (RDS 경우) 콘솔에서도 확인이 가능하지만, log_fdw 확장을 통해 DB 접속해서 테이블처럼 조회를 할수 있다.
log_fdw 확장을 설치하면 아래 두가지 함수의 사용이 가능해진다.
list_postgres_log_files : 로그 디렉토리의 로그파일 list
create_foreign_table_for_log_file : 현재DB의 foreign table 생성
엔진에서 log 를 읽기 위해서는 .csv 로 로그가 만들어져야 하고, 파라미터 변경이 필요하다.
-- 파라미터 세팅
log_destination='csvlog'
-- log_fdw 확장을 설치
CREATE EXTENSION log_fdw;
-- 로그 서버를 외부 데이터 래퍼로 생성
CREATE SERVER log_server FOREIGN DATA WRAPPER log_fdw;
-- 로그 파일 목록에서 모든 파일을 선택
SELECT * FROM list_postgres_log_files() ORDER BY 1;

-- 선택한 파일에 대해 단일 'log_entry' 열이 있는 테이블을 생성
SELECT create_foreign_table_for_log_file('pglog_test_dt',
'log_server', 'postgresql.log.2025-09-30-04.csv');
SELECT log_time, message FROM my_postgres_error_log ORDER BY 1;

drop foreign table my_postgres_error_log;
* 아쉽지만 외부테이블 생성할때 * (와일드카드) 를 지원하지 않아 매번 새로운 로그가 생기면 새로 테이블 생성해야함.