PostgreSQL 데이터베이스 로그 파일 - Amazon Relational Database Service

PostgreSQL 데이터베이스 로그 파일

RDS for PostgreSQL에서는 쿼리 및 오류 로그를 생성합니다. 로그 메시지를 사용하여 데이터베이스를 사용하는 동안 성능과 감사 문제를 해결할 수 있습니다.

파일 기반 데이터베이스 로그를 보고 다운로드하고 모니터링하려면 Amazon RDS 로그 파일 모니터링 섹션을 참조하세요.

PostgreSQL 로그 개요

PostgreSQL은 DBA에 대한 유용한 정보를 포함하는 이벤트 로그 파일을 생성합니다.

로그 내용

기본 로깅 수준은 서버에 영향을 미치는 오류를 캡처합니다. 기본적으로, Amazon RDS PostgreSQL 로깅 파라미터는 다음을 포함하여 모든 서버 오류를 캡처합니다.

  • 쿼리 실패

  • 로그인 실패

  • 치명적인 서버 오류

  • 교착

애플리케이션 문제를 식별하기 위해 로그에서 쿼리 실패, 로그인 실패, 교착 상태 및 치명적인 서버 오류를 찾아볼 수 있습니다. 예를 들어, 레거시 애플리케이션을 Oracle에서 Amazon RDS PostgreSQL로 변환한 경우 일부 쿼리가 올바르게 변환되지 않을 수 있습니다. 이러한 잘못된 형식의 쿼리는 로그에 오류 메시지를 생성하고, 이는 문제가 있는 코드를 식별하는 데 사용할 수 있습니다.

PostgreSQL 로깅 파라미터를 수정하여 다음 카테고리에 따라 추가 정보를 캡처할 수 있습니다.

  • 연결 및 연결 해제

  • 체크포인트

  • 스키마 수정 쿼리

  • 잠금 대기 쿼리

  • 임시 디스크 스토리지를 사용하는 쿼리

  • 리소스를 소비하는 백엔드 Autovacuum 프로세스

목록에 표시된 것과 같은 다양한 카테고리에 대한 정보를 로깅하여 잠재적인 성능 및 감사 문제를 해결할 수 있습니다. 자세한 내용은 PostgreSQL 문서에서 오류 보고 및 로깅을 참조하세요. PostgreSQL 로깅에 대한 유용한 AWS 블로그는 RDS 및 Aurora PostgreSQL 로그로 작업하기: 파트 1RDS 및 Aurora PostgreSQL 로그로 작업하기: 파트 2를 참조하세요.

로깅 동작에 영향을 주는 매개변수

Amazon RDS PostgreSQL 인스턴스에는 로깅의 다양한 측면을 포함하여 구성을 지정하는 파라미터 그룹이 있습니다. 기본 파라미터 그룹 설정은 지정된 AWS 리전 내에서 모든 RDS for PostgreSQL DB 인스턴스에 적용됩니다. 사용자의 인스턴스가 아니더라도 기본값이 지정된 엔진의 모든 인스턴스에 적용되기 때문에 기본값을 변경할 수 없습니다. 파라미터 값을 수정하려면 사용자 지정 파라미터 그룹을 생성하고 설정을 수정합니다. 예를 들어 로깅 파라미터를 설정하거나 변경하려면 RDS for PostgreSQL DB 인스턴스와 관련된 사용자 정의 파라미터 그룹을 변경합니다. 자세한 방법은 파라미터 그룹 작업 섹션을 참조하세요.

RDS for PostgreSQL DB 인스턴스의 경우 로깅 동작에 영향을 주는 파라미터는 다음과 같습니다.

  • rds.log_retention_period - 지정된 시간(분)보다 오래된 PostgreSQL 로그가 삭제됩니다. 기본값인 4,320분으로 지정하면 3일이 지난 로그 파일이 삭제됩니다. 자세한 정보는 로그 보존 기간 설정을 참조하십시오.

  • log_rotation_age - Amazon RDS가 로그를 자동으로 교체하는 시간(분)을 지정합니다. 기본값은 60분이지만 1분에서 1,440분까지 지정할 수 있습니다. 자세한 정보는 로그 파일 회전 설정을 참조하십시오.

  • log_rotation_size - Amazon RDS가 로그를 자동으로 교체해야 하는 크기(KB)를 설정합니다. log_rotation_age 파라미터에 의해 지정된 대로 로그가 연령에 따라서만 교체되기 때문에 기본적으로는 값이 없습니다. 자세한 정보는 로그 파일 회전 설정을 참조하십시오.

  • log_line_prefix - 로깅되는 각 줄 앞에 붙는 정보를 지정합니다. 이 파라미터의 기본 문자열은 %t:%r:%u@%d:[%p]:으로, 로그 항목의 시간(%t)을 비롯하여 데이터베이스 이름(%d) 과 같은 구별되는 특성을 기록합니다. 이 파라미터는 변경할 수 없습니다. 이 파라미터는 로깅되는 stderr 메시지에 적용됩니다.

  • log_destination - 서버 로그의 출력 형식을 설정합니다. 이 파라미터의 기본값은 표준 오류(stderr)이지만 csvlog(쉼표로 구분된 값 로그 파일)도 지원합니다. 자세한 정보는 로그 대상 설정을 참조하십시오.

로그 보존 기간 설정

시스템 로그의 보존 기간을 설정하려면 rds.log_retention_period 파라미터를 사용합니다. DB 인스턴스 와 연결된 DB 파라미터 그룹에서 rds.log_retention_period를 찾을 수 있습니다. 이 파라미터의 단위는 분입니다. 예를 들어 1,440으로 설정하면 로그가 하루 동안 유지됩니다. 기본값은 4,320(3일)입니다. 최대값은 10,080(7일)입니다. 인스턴스에는 보존되는 로그 파일을 포함하기에 충분하게 할당된 스토리지가 필요합니다.

로그가 RDS for PostgreSQL DB 인스턴스에서 제거된 후 오랫동안 시스템 데이터를 보고 분석할 수 있도록 로그를 정기적으로 Amazon CloudWatch Logs에 게시하는 것이 좋습니다. 자세한 내용은 Amazon CloudWatch Logs에 PostgreSQL 로그 게시 단원을 참조하십시오.

로그 파일 회전 설정

새 로그 파일은 기본적으로 매 시간 Amazon RDS에 의해 생성됩니다. 타이밍은 log_rotation_age 파라미터로 제어됩니다. 이 파라미터의 기본값은 60(분)이지만 1분에서 24시간(1,440분) 사이로 설정할 수 있습니다. 교체 시간이 되면 새 로그 파일이 생성됩니다. 파일의 이름은 log_filename 파라미터로 지정된 패턴에 따라 결정됩니다.

로그 파일은 log_rotation_size 파라미터에 지정된 대로 크기에 따라 교체될 수도 있습니다. 이 파라미터는 로그가 특정 크기(KB)에 도달하면 교체되도록 지정합니다. RDS for PostgreSQL DB 인스턴스의 경우 log_rotation_size가 설정되지 않습니다. 즉, 지정된 값이 없습니다. 그러나 이 파라미터는 0~2,097,151KB(킬로바이트) 사이로 설정할 수 있습니다.

로그 파일 이름은 log_filename 파라미터의 파일 이름 패턴을 기반으로 합니다. 다음과 같이 시간 또는 분으로 파일 이름을 지정할 수 있습니다.

  • postgresql.log.%Y-%m-%d-%H%M - 로그 파일 이름이 분 형식입니다. 로그의 세부 기간을 1시간 미만으로 설정합니다. PostgreSQL 버전 이상에서만 지원됩니다.

  • postgresql.log.%Y-%m-%d-%H - 로그 파일 이름이 시간 형식입니다. 로그의 세부 기간을 시간으로 설정합니다.

log_rotation_age 파라미터를 60분 미만으로 설정한 경우 log_filename 파라미터도 분 형식으로 설정해야 합니다.

자세한 내용은 PostgreSQL 설명서log_rotation_agelog_rotation_age를 참조하세요.

로그 대상 설정

기본적으로 Amazon RDS PostgreSQL은 표준 오류(stderr) 형식으로 로그를 생성합니다. 이것이 log_destination 파라미터에 대한 기본 설정입니다. 이 형식은 log_line_prefix 파라미터에 지정된 대로 각 로그 메시지에 시간, 데이터베이스 및 기타 세부 정보를 접두사로 지정합니다. log_line_prefix는 다음과 같은 텍스트 문자열로 설정되며 변경할 수 없습니다.

%t:%r:%u@%d:[%p]:t

이 파리미터는 각 로그 항목에 대해 다음과 같은 세부 정보를 지정합니다.

  • %t - 로그 입력 시간

  • %r - 원격 호스트 주소

  • %u@%d - 사용자 이름 @ 데이터베이스 이름

  • [%p] - 프로세스 ID(사용 가능한 경우)

예를 들어 잘못된 이름을 사용하여 열을 쿼리하면 다음과 같은 오류 메시지가 나타납니다.

2019-03-10 03:54:59 UTC:10.0.0.123(52834):postgres@tstdb:[20175]:ERROR: column "wrong" does not exist at character 8

RDS for PostgreSQLlog_destination 파라미터로 지정된 기본값인 stderr 외에도 csvlog 형식으로 로그를 생성할 수 있습니다. csvlog는 로그 데이터를 CSV 데이터로 분석하는 데 유용합니다. 예를 들어 외부 테이블로 로그를 사용하기 위해 log_fdw 확장을 사용한다고 합시다. stderr 로그 파일에 만들어진 외부 테이블에는 로그 이벤트 데이터가 있는 하나의 열이 포함되어 있습니다. CSV 형식의 로그 파일의 경우 외부 테이블에는 여러 개의 열이 있으므로 로그를 훨씬 쉽게 정렬하고 분석할 수 있습니다. log_fdwcsvlog와 함께 사용하는 방법을 알아보려면 log_fdw 확장으로 SQL을 사용하여 DB 로그에 액세스 섹션을 참조하세요.

log_destination 설정을 변경할 수 있도록 사용자 지정 매개 변수 그룹을 사용 중이어야 합니다. log_destination 파라미터는 동적이므로 재부팅되지 않고 변경 사항이 즉시 적용됩니다.

이 파라미터를 변경하는 경우 stderr 로그 외에 csvlog 파일이 생성된다는 점을 알아야 합니다. rds.log_retention_period 및 로그 스토리지 및 회전율에 영향을 주는 다른 설정을 고려하여 로그에서 사용하는 스토리지에 주의를 기울이는 것이 좋습니다. stderrcsvlog를 모두 사용하는 경우 로그에서 소비하는 스토리지가 두 배 이상 늘어납니다.

log_destinationcsvlog를 포함하도록 설정 한 후 나중에 기본값(stderr)만 사용하는 것으로 되돌리려면 AWS Management Console을 사용하여 인스턴스의 사용자 지정 파라미터 그룹을 열고 목록에서 log_destination 파라미터를 선택하고 파라미터 편집(Edit parameter)를 선택한 후 재설정(Reset)을 선택합니다. 이렇게 하면 log_destination 파라미터를 기본 설정인 stderr로 되돌릴 수 있습니다.

로깅 구성에 대한 자세한 내용은 Amazon RDS 및 Aurora PostgreSQL 로그 작업: 1부를 참조하세요.

쿼리 로깅 활성화

PostgreSQL DB 인스턴스에 대한 쿼리 로깅을 활성화하려면 DB 인스턴스와 연결된 DB 파라미터 그룹에서 log_statementlog_min_duration_statement의 두 파라미터를 설정합니다.

log_statement 파라미터는 어떤 SQL 문이 로그에 기록되는지 제어합니다. 기본 값은 none입니다. DB 인스턴스에서 문제를 디버깅할 때 이 파라미터를 all로 설정하여 모든 문을 기록하는 것이 좋습니다. 모든 데이터 정의 언어(DDL) 문(CREATE, ALTER, DROP 등)을 기록하려면 이 값을 ddl로 설정합니다. 모든 DDL 및 데이터 수정 언어(DML) 문(INSERT, UPDATE, DELETE 등)을 기록하려면 이 값을 mod로 설정합니다.

주의

log_statement 파라미터를 ddl, mod 또는 all(으)로 설정하면 암호 등의 중요한 정보가 노출될 수 있습니다. 이런 위험을 피하려면 log_statementnone으로 설정합니다. 또한 다음 솔루션을 고려해 보세요.

  • 클라이언트 측의 중요한 정보를 암호화하고 ENCRYPTEDUNENCRYPTED 문의 CREATEALTER 옵션을 사용합니다.

  • CloudWatch 로그에 대한 액세스를 제한합니다.

  • IAM 등의 보다 강력한 인증 메커니즘을 사용합니다.

감사의 경우, PostgreSQL pgAudit 확장을 사용할 수 있습니다. 이는 CREATE 및 ALTER 명령에 대한 중요한 정보를 수정하기 때문입니다.

log_min_duration_statement 파라미터는 로그에 기록할 문의 한계를 밀리초 단위로 설정합니다. 이 파라미터 설정보다 오래 실행되는 모든 SQL 문이 로그에 기록됩니다. 이 파라미터는 기본적으로 비활성화되어 있고 -1로 설정됩니다. 이 파라미터를 활성화하면 최적화되지 않은 쿼리를 찾는 데 도움이 될 수 있습니다.

쿼리 로깅을 설정하려면 다음 단계를 수행합니다.

  1. log_statement 파라미터를 all로 설정합니다. 다음 예제에서는 postgresql.log 파일에 기록되는 정보를 보여줍니다.

    2013-11-05 16:48:56 UTC::@:[2952]:LOG: received SIGHUP, reloading configuration files 2013-11-05 16:48:56 UTC::@:[2952]:LOG: parameter "log_statement" changed to "all"

    쿼리를 실행할 때 postgresql.log 파일에 추가 정보가 기록됩니다. 다음 예제에서는 쿼리 후 파일에 기록되는 정보의 유형을 보여줍니다.

    2013-11-05 16:41:07 UTC::@:[2955]:LOG: checkpoint starting: time 2013-11-05 16:41:07 UTC::@:[2955]:LOG: checkpoint complete: wrote 1 buffers (0.3%); 0 transaction log file(s) added, 0 removed, 1 recycled; write=0.000 s, sync=0.003 s, total=0.012 s; sync files=1, longest=0.003 s, average=0.003 s 2013-11-05 16:45:14 UTC:[local]:master@postgres:[8839]:LOG: statement: SELECT d.datname as "Name", pg_catalog.pg_get_userbyid(d.datdba) as "Owner", pg_catalog.pg_encoding_to_char(d.encoding) as "Encoding", d.datcollate as "Collate", d.datctype as "Ctype", pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges" FROM pg_catalog.pg_database d ORDER BY 1; 2013-11-05 16:45:
  2. log_min_duration_statement 파라미터를 설정합니다. 다음 예제에서는 이 파라미터가 postgresql.log로 설정되어 있을 때 1 파일에 기록되는 정보를 보여줍니다.

    2013-11-05 16:48:56 UTC::@:[2952]:LOG: received SIGHUP, reloading configuration files 2013-11-05 16:48:56 UTC::@:[2952]:LOG: parameter "log_min_duration_statement" changed to "1"

    지속 시간 파라미터 설정을 초과하는 쿼리를 실행할 때 postgresql.log 파일에 추가 정보가 기록됩니다. 다음 예제에서는 쿼리 후 파일에 기록되는 정보의 유형을 보여줍니다.

    2013-11-05 16:51:10 UTC:[local]:master@postgres:[9193]:LOG: statement: SELECT c2.relname, i.indisprimary, i.indisunique, i.indisclustered, i.indisvalid, pg_catalog.pg_get_indexdef(i.indexrelid, 0, true), pg_catalog.pg_get_constraintdef(con.oid, true), contype, condeferrable, condeferred, c2.reltablespace FROM pg_catalog.pg_class c, pg_catalog.pg_class c2, pg_catalog.pg_index i LEFT JOIN pg_catalog.pg_constraint con ON (conrelid = i.indrelid AND conindid = i.indexrelid AND contype IN ('p','u','x')) WHERE c.oid = '1255' AND c.oid = i.indrelid AND i.indexrelid = c2.oid ORDER BY i.indisprimary DESC, i.indisunique DESC, c2.relname; 2013-11-05 16:51:10 UTC:[local]:master@postgres:[9193]:LOG: duration: 3.367 ms 2013-11-05 16:51:10 UTC:[local]:master@postgres:[9193]:LOG: statement: SELECT c.oid::pg_catalog.regclass FROM pg_catalog.pg_class c, pg_catalog.pg_inherits i WHERE c.oid=i.inhparent AND i.inhrelid = '1255' ORDER BY inhseqno; 2013-11-05 16:51:10 UTC:[local]:master@postgres:[9193]:LOG: duration: 1.002 ms 2013-11-05 16:51:10 UTC:[local]:master@postgres:[9193]:LOG: statement: SELECT c.oid::pg_catalog.regclass FROM pg_catalog.pg_class c, pg_catalog.pg_inherits i WHERE c.oid=i.inhrelid AND i.inhparent = '1255' ORDER BY c.oid::pg_catalog.regclass::pg_catalog.text; 2013-11-05 16:51:18 UTC:[local]:master@postgres:[9193]:LOG: statement: select proname from pg_proc; 2013-11-05 16:51:18 UTC:[local]:master@postgres:[9193]:LOG: duration: 3.469 ms

Amazon CloudWatch Logs에 PostgreSQL 로그 게시

매우 내구력 있는 스토리지에 PostgreSQL 로그 레코드를 저장하려면 Amazon CloudWatch Logs를 사용하면 됩니다. CloudWatch Logs를 사용하면 로그 데이터에 대한 실시간 분석을 수행하고 CloudWatch를 통해 지표를 보고 경보를 생성할 수도 있습니다. 예를 들어, log_statements을(를) ddl(으)로 설정하면 DDL 문이 실행될 때마다 경고하도록 경보를 설정할 수 있습니다.

CloudWatch Logs로 작업하려면 로그 그룹에 로그 데이터를 게시하도록 RDS for PostgreSQL DB 인스턴스를 구성하십시오.

참고

CloudWatch Logs에 로그 파일을 게시하는 기능은 PostgreSQL 버전 9.6.6 이상과 PostgreSQL 10.4 이상 및 모든 상위 릴리스에서 지원됩니다.

RDS for PostgreSQL용 CloudWatch Logs에 다음 로그 유형을 게시할 수 있습니다.

  • Postgresql 로그

  • 업그레이드 로그(Aurora PostgreSQL에 사용할 수 없음)

구성을 완료하고 나면 Amazon RDS에서 CloudWatch 로그 그룹 내 로그 스트림에 로그 이벤트를 게시합니다. 예를 들면 PostgreSQL 로그 데이터가 로그 그룹 /aws/rds/instance/my_instance/postgresql 안에 저장됩니다. 로그를 보려면 https://console.aws.amazon.com/cloudwatch/에서 CloudWatch 콘솔을 엽니다.

콘솔을 사용하여 PostgreSQL 로그를 CloudWatch Logs에 게시하려면

  1. https://console.aws.amazon.com/rds/에서 Amazon RDS 콘솔을 엽니다.

  2. 탐색 창에서 데이터베이스를 선택합니다.

  3. 수정할 DB 인스턴스를 선택한 다음 수정을 선택합니다.

  4. 로그 내보내기 섹션에서 CloudWatch Logs에 게시하기 시작할 로그를 선택합니다.

    로그 내보내기 섹션은 CloudWatch Logs에 게시하는 기능을 지원하는 PostgreSQL 버전에서만 제공됩니다.

  5. [Continue]를 선택한 후, 요약 페이지에서 [Modify DB Instance]를 선택합니다.

AWS CLI를 통해 PostgreSQL 로그를 게시할 수 있습니다. 다음 파라미터로 modify-db-instance 명령을 호출할 수 있습니다.

  • --db-instance-identifier

  • --cloudwatch-logs-export-configuration

참고

--cloudwatch-logs-export-configuration 옵션에 대한 변경 사항은 항상 DB 인스턴스에 즉시 적용됩니다. 따라서 --apply-immediately--no-apply-immediately 옵션은 지정해도 아무런 효과가 없습니다.

또한 다음 CLI 명령을 호출하여 PostgreSQL 로그를 게시할 수도 있습니다.

다음 옵션으로 CLI 명령 중 하나를 실행합니다.

  • --db-instance-identifier

  • --enable-cloudwatch-logs-exports

  • --db-instance-class

  • --engine

실행하는 CLI 명령에 따라 다른 옵션이 필요할 수 있습니다.

예 로그를 CloudWatch Logs에 게시하도록 인스턴스 수정

다음 예에서는 CloudWatch Logs에 로그 파일을 게시하도록 기존 PostgreSQL DB 인스턴스를 수정합니다. --cloudwatch-logs-export-configuration 값은 JSON 객체입니다. 이 객체에 대한 키는 EnableLogTypes이며, 해당 값은 postgresqlupgrade의 조합을 사용하는 문자열의 배열입니다.

Linux, macOS 또는 Unix의 경우는 다음과 같습니다.

aws rds modify-db-instance \ --db-instance-identifier mydbinstance \ --cloudwatch-logs-export-configuration '{"EnableLogTypes":["postgresql", "upgrade"]}'

Windows의 경우:

aws rds modify-db-instance ^ --db-instance-identifier mydbinstance ^ --cloudwatch-logs-export-configuration '{"EnableLogTypes":["postgresql","upgrade"]}'

예 로그를 CloudWatch Logs에 게시하도록 인스턴스 생성

다음 예에서는 CloudWatch Logs에 로그 파일을 게시하도록 PostgreSQL DB 인스턴스를 생성합니다. --enable-cloudwatch-logs-exports 값은 문자열의 JSON 배열입니다. 문자열은 postgresqlupgrade의 조합일 수 있습니다.

Linux, macOS 또는 Unix의 경우는 다음과 같습니다.

aws rds create-db-instance \ --db-instance-identifier mydbinstance \ --enable-cloudwatch-logs-exports '["postgresql","upgrade"]' \ --db-instance-class db.m4.large \ --engine postgres

Windows의 경우:

aws rds create-db-instance ^ --db-instance-identifier mydbinstance ^ --enable-cloudwatch-logs-exports '["postgresql","upgrade"]' ^ --db-instance-class db.m4.large ^ --engine postgres

RDS API를 사용하여 PostgreSQL 로그를 게시할 수 있습니다. 다음 파라미터로 ModifyDBInstance 작업을 호출할 수 있습니다.

  • DBInstanceIdentifier

  • CloudwatchLogsExportConfiguration

참고

CloudwatchLogsExportConfiguration 파라미터에 대한 변경 사항은 항상 DB 인스턴스에 즉시 적용됩니다. 따라서 ApplyImmediately 파라미터는 지정해도 아무런 효과가 없습니다.

또한 다음 RDS API 작업을 호출해 PostgreSQL 로그를 게시할 수 있습니다.

다음 파라미터로 RDS API 작업 중 하나를 실행합니다.

  • DBInstanceIdentifier

  • EnableCloudwatchLogsExports

  • Engine

  • DBInstanceClass

실행하는 작업에 따라 다른 파라미터가 필요할 수 있습니다.