log_fdw 확장을 사용해 SQL로 DB 로그 접근하기

log_fdw 확장을 사용해 SQL로 DB 로그 접근하기

RDS for PostgreSQL DB 인스턴스는 log_fdw 확장을 지원해요. 이 확장을 쓰면 데이터베이스 엔진 로그를 SQL 인터페이스로 접근할 수 있어요. 옆에서 설명해주는 강사 목소리로, 로그를 테이블처럼 다루는 방법을 함께 살펴볼게요.

출처: 문서

본문

RDS for PostgreSQL DB 인스턴스는 log_fdw 확장을 지원해요. 이 확장을 사용하면 SQL 인터페이스를 통해 데이터베이스 엔진 로그에 접근할 수 있어요. log_fdw 확장은 데이터베이스 로그를 위한 외부 테이블(foreign table)을 쉽게 만들 수 있게 해주는 두 가지 함수를 제공해요.

  • list_postgres_log_files – 데이터베이스 로그 디렉터리의 파일과 파일 크기(바이트)를 나열해요.
  • create_foreign_table_for_log_file(table_name text, server_name text, log_file_name text) – 현재 데이터베이스에서 지정한 파일에 대한 외부 테이블을 생성해요.

log_fdw가 만든 모든 함수는 rds_superuser가 소유해요. rds_superuser 역할의 구성원은 다른 데이터베이스 사용자에게 이 함수들에 대한 접근 권한을 부여할 수 있어요.

기본적으로 Amazon RDS가 생성하는 로그 파일은 log_destination 매개변수에 지정된 대로 stderr(표준 오류) 형식이에요. 이 매개변수에는 stderr와 csvlog(쉼표로 구분된 값, CSV) 두 가지 옵션만 있어요. csvlog 옵션을 매개변수에 추가하면 Amazon RDS는 stderr와 csvlog 로그를 모두 생성해요. 이는 DB 클러스터의 스토리지 용량에 영향을 줄 수 있으므로 로그 처리를 다루는 다른 매개변수들을 잘 알고 있어야 해요. 자세한 내용은 "로그 대상 설정(stderr, csvlog)" 문서를 참고하세요.

csvlog 로그를 생성할 때의 이점 중 하나는 log_fdw 확장을 사용해 데이터를 여러 열로 깔끔하게 나눈 외부 테이블을 만들 수 있다는 점이에요. 이렇게 하려면 log_destination 설정을 변경할 수 있도록 인스턴스가 사용자 지정 DB 파라미터 그룹과 연결되어 있어야 해요. 자세한 방법은 "RDS for PostgreSQL DB 인스턴스의 파라미터 작업" 문서를 참고하세요.

다음 예시는 log_destination 매개변수에 csvlog가 포함되어 있다고 가정해요.

log_fdw 확장을 사용하려면

  1. log_fdw 확장을 설치해요.
postgres=> CREATE EXTENSION log_fdw;
CREATE EXTENSION
  1. 로그 서버를 외부 데이터 래퍼(foreign data wrapper)로 생성해요.
postgres=> CREATE SERVER log_server FOREIGN DATA WRAPPER log_fdw;
CREATE SERVER
  1. 로그 파일 목록에서 전체를 선택해요.
postgres=> SELECT * FROM list_postgres_log_files() ORDER BY 1;

샘플 응답은 다음과 같아요.

          file_name           | file_size_bytes
------------------------------+-----------------
 postgresql.log.2023-08-09-22.csv |            1111
 postgresql.log.2023-08-09-23.csv |            1172
 postgresql.log.2023-08-10-00.csv |            1744
 postgresql.log.2023-08-10-01.csv |            1102
(4 rows)
  1. 선택한 파일에 대해 단일 log_entry 열을 가진 테이블을 생성해요.
postgres=> SELECT create_foreign_table_for_log_file('my_postgres_error_log',
     'log_server', 'postgresql.log.2023-08-09-22.csv');

응답은 테이블이 이제 존재한다는 사실 외에는 세부 정보를 제공하지 않아요.

-----------------------------------
(1 row)
  1. 로그 파일의 샘플을 선택해요. 다음 코드는 로그 시간과 오류 메시지 설명을 검색해요.
postgres=> SELECT log_time, message FROM my_postgres_error_log ORDER BY 1;

샘플 응답은 다음과 같아요.

             log_time             |                                  message
----------------------------------+---------------------------------------------------------------------------
Tue Aug 09 15:45:18.172 2023 PDT | ending log output to stderr
Tue Aug 09 15:45:18.175 2023 PDT | database system was interrupted; last known up at 2023-08-09 22:43:34 UTC
Tue Aug 09 15:45:18.223 2023 PDT | checkpoint record is at 0/90002E0
Tue Aug 09 15:45:18.223 2023 PDT | redo record is at 0/90002A8; shutdown FALSE
Tue Aug 09 15:45:18.223 2023 PDT | next transaction ID: 0/1879; next OID: 24578
Tue Aug 09 15:45:18.223 2023 PDT | next MultiXactId: 1; next MultiXactOffset: 0
Tue Aug 09 15:45:18.223 2023 PDT | oldest unfrozen transaction ID: 1822, in database 1
(7 rows)

더 알아보기 (Learn more)