PostgreSQL 로그는 문제 해결, 성능 추적, 데이터베이스 감사에 중요한 자원입니다. 애플리케이션을 프로덕션에 배포하기 전에 로그 설정을 최적화하여, 필요한 정보를 충분히 기록하면서도 성능 저하를 방지하는 것이 중요합니다.
이를 위해 다양한 로그 설정 옵션을 이해하고, 로그 활용 목적에 맞게 조정해야 합니다. 로그 설정은 문제가 발생하기 전에 미리 구성해야 하며, 이 글에서는 로그 설정 방법, 메시지 해석, 성능 향상 팁 등을 제공합니다.
PostgreSQL을 설치하고 실행 중인지 확인해야 합니다. 특히 PostgreSQL 15 이상의 버전이 필요합니다. 이 버전에서는 JSON 형식으로 구조화된 로그를 출력할 수 있습니다.
1. 클라이언트 버전 확인
다음 명령어로 클라이언트 버전을 확인할 수 있습니다
psql --version # 클라이언트 버전 확인
psql (PostgreSQL) 15.3
2. 샘플 데이터베이스 설정
이 글의 예제를 따라가려면, Chinook이라는 샘플 데이터베이스를 설정해야 합니다. Chinook 데이터베이스는 디지털 미디어 스토어를 나타내며, 아티스트, 앨범, 미디어 트랙, 청구서, 고객에 대한 테이블을 포함합니다.
데이터베이스 파일 다운로드
먼저, 다음 명령어로 데이터베이스 파일을 다운로드합니다
curl -LO https://gist.github.com/ayoisaiah/ebf628402706de0b6053699f9e0776ed/raw/43a4ce34a3c7ef397d2cf235f20f9217985f18e1/chinook.sql
psql 인터페이스 실행
기본 postgres 사용자로 psql 인터페이스를 실행합니다
sudo -u postgres psql
Chinook 데이터베이스 생성
#다음 명령어로 chinook 데이터베이스를 생성합니다
CREATE DATABASE chinook OWNER postgres;
CREATE DATABASE
#Chinook 데이터베이스 연결
#생성된 chinook 데이터베이스에 연결합니다
\c chinook
데이터베이스 테이블 생성 및 데이터 삽입
다운로드한 chinook.sql 파일을 실행하여 테이블을 생성하고 데이터를 삽입합니다
\i chinook.sql
명령어가 실행된 후, 다음 쿼리를 실행하여 데이터가 제대로 삽입되었는지 확인할 수 있
TABLE album LIMIT 10;
출력 예시
albumid | title | artistid
---------+---------------------------------------+----------
1 | For Those About To Rock We Salute You | 1
2 | Balls to the Wall | 2
3 | Restless and Wild | 2
4 | Let There Be Rock | 1
5 | Big Ones | 3
6 | Jagged Little Pill | 4
7 | Facelift | 5
8 | Warner 25 Anos | 6
9 | Plays Metallica By Four Cellos | 7
10 | Audioslave | 8
(10 rows)
psql 인터페이스 종료
\q
로그 확인 및 설정 팁
이제 데이터베이스에 대한 작업을 수행할 수 있으며, 다음 단계에서 PostgreSQL 서버가 생성하는 로그를 확인하는 방법을 배울 수 있습니다. 테스트 목적으로 모든 데이터베이스 쿼리를 서버 로그에 기록하려면 SET log_statement = 'all'; 명령어를 psql에서 입력할 수 있습니다.
추가 정보: PostgreSQL 로그는 문제 해결 및 성능 추적에 중요한 역할을 합니다. 이를 통해 데이터베이스의 상태를 모니터링하고, 발생할 수 있는 문제를 신속하게 해결할 수 있습니다. JSON 형식의 구조화된 로그를 사용하면 로그 데이터를 보다 쉽게 분석하고 자동화된 도구와 통합할 수 있습니다.
PostgreSQL 서버는 기본적으로 로그를 표준 에러 스트림(stderr)으로 출력합니다. 이 설정은 다음 쿼리를 통해 확인할 수 있습니다.
SHOW log_destination;
log_destination
-----------------
stderr
(1 row)
PostgreSQL는 로그를 캡처하고 파일로 라우팅하는 logging_collector 프로세스를 제공합니다. 이 logging_collector의 동작은 해당 설정에 의해 제어됩니다.
logging_collector 상태 확인
SHOW logging_collector;
logging_collector
-------------------
off
(1 row)
기본적으로 logging_collector는 꺼져 있어서, PostgreSQL 로그는 서버의 표준 에러 스트림으로만 전송되며, 로그가 어디로 저장되는지는 이 스트림이 어디로 향하는지에 따라 달라집니다.
logging_collector가 켜져 있는 경우 로그 파일 위치 확인
만약 logging_collector가 활성화되어 있다면, 다음 쿼리를 실행하여 현재 로그 파일의 위치를 확인할 수 있습니다
SELECT pg_current_logfile();
pg_current_logfile
------------------------
log/postgresql-Thu.log
(1 row)
이 파일(log/postgresql-Thu.log)은 PostgreSQL 데이터 디렉토리에 상대적으로 위치해 있으며,
데이터 디렉토리는 다음 쿼리로 확인할 수 있습니다
SHOW data_directory;
data_directory
---------------------
/var/lib/pgsql/data
(1 row)
이 예시에서 로그 파일의 전체 경로는 다음과 같습니다
/var/lib/pgsql/data/log/postgresql-Thu.log
이제 PostgreSQL 로그 파일을 찾았으니, 다음 섹션에서는 파일 내용을 탐색할 때 접할 수 있는 다양한 로그 유형을 살펴보겠습니다.
추가 정보: PostgreSQL의 로그 파일은 서버 상태를 모니터링하고 문제를 해결하는 데 필수적인 자원입니다. 특히 logging_collector가 활성화된 경우, 로그 파일을 통해 서버의 자세한 운영 상태를 추적할 수 있습니다. 로그 파일의 위치는 운영 체제와 PostgreSQL 설정에 따라 달라질 수 있으므로, 앞서 언급한 명령어들을 활용해 정확한 경로를 확인하는 것이 중요합니다.
PostgreSQL의 로그 유형에는 여러 가지가 있으며, 구성에 따라 로그 파일에서 다양한 유형의 로그를 볼 수 있습니다. 다음은 가장 중요한 로그 유형과 그 예시를 설명한 내용입니다.
시작 로그
LOG: starting PostgreSQL 15.3 (Ubuntu 15.3-0ubuntu0.22.04.1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.3.0-1ubuntu1~22.04.1) 11.3.0, 64-bit
LOG: listening on IPv4 address "127.0.0.1", port 5432
LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
LOG: database system was shut down at 2023-07-27 17:45:08 UTC
LOG: database system is ready to accept connections
종료 로그
LOG: received fast shutdown request
LOG: aborting any active transactions
LOG: background worker "logical replication launcher" (PID 82894) exited with exit code 1
LOG: shutting down
LOG: database system is shut down
LOG: statement: select distinct billingcountry from invoice;
LOG: statement: select albumid, title from album where artistid = 2;
LOG: duration: 13.020 ms
LOG: duration: 13.504 ms statement: UPDATE album SET title = 'Audioslave' WHERE albumid = 10;
ERROR: relation "custome" does not exist at character 15
STATEMENT: select * from custome where country = 'Brazil';
ERROR: duplicate key value violates unique constraint "pk_album"
DETAIL: Key (albumid)=(10) already exists.
STATEMENT: UPDATE album SET albumid = 10 WHERE albumid = 2;
이 로그들은 PostgreSQL의 작동 상태를 모니터링하고 문제를 진단하는 데 유용합니다.
클라이언트의 데이터베이스 연결 및 연결 해제에 관한 정보는 로그에 기록될 수 있습니다. 이러한 기록에는 소스 IP 주소, 사용자 이름, 데이터베이스 이름, 연결 상태가 포함됩니다. 연결 해제 시에는 세션 총 지속 시간도 포함됩니다.
LOG: connection received: host=[local]
LOG: connection authenticated: identity="postgres" method=peer (/etc/postgresql/15/main/pg_hba.conf:90)
LOG: connection authorized: user=postgres database=chinook application_name=psql
LOG: disconnection: session time: 0:00:08.602 user=postgres database=chinook host=[local]
LOG: checkpoint starting: time
LOG: checkpoint complete: wrote 3 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.005 s, sync=0.002 s, total=0.025 s; sync files=2, longest=0.001 s, average=0.001 s; distance=0 kB, estimate=0 kB
로깅 수집기는 표준 오류에 전송된 로그 메시지를 캡처하여 파일로 리디렉션하는 백그라운드 프로세스입니다. 수집기를 활성화하면 PostgreSQL 로그는 /var/log/postgresql/postgresql-15-main.log 파일에 리디렉션되지 않고 별도의 디렉토리에 저장됩니다.
SHOW config_file;
sudo nano /etc/postgresql/15/main/postgresql.conf
--logging_collector 옵션을 활성화
logging_collector = on
파일을 저장하고 PostgreSQL 서버를 재시작
sudo systemctl restart postgresql
tail /var/log/postgresql/postgresql-15-main.log
LOG: redirecting log output to logging collector process
HINT: Future log output will appear in directory "log".
로그 디렉토리는 log_directory 설정에 의해 제어됩니다
log_directory = 'log'
로그 파일은 /var/lib/postgresql/15/main/log/ 디렉토리에 저장됩니다
sudo ls /var/lib/postgresql/15/main/log/
PostgreSQL 로그의 유형과 설정 방법에 대한 설명이 충분히 잘 되어 있습니다. 추가로 고려할 수 있는 몇 가지 사항과 팁을 말씀드리겠습니다.
1. 로그 레벨 조정
PostgreSQL에서는 로그 레벨을 설정하여 기록되는 로그의 세부 수준을 조정할 수 있습니다. 로그 레벨은 log_min_messages와 log_min_error_statement를 통해 설정합니다. 예를 들어, log_min_messages를 DEBUG1로 설정하면 디버깅 정보를 포함한 로그가 기록됩니다.
log_min_messages = 'DEBUG1'
이를 통해 보다 상세한 로그를 확보할 수 있습니다.
2. 로그 필터링
로그 필터링 특정 종류의 로그만 기록하려는 경우, log_statement 설정을 통해 기록할 쿼리의 종류를 지정할 수 있습니다. 예를 들어, 모든 쿼리를 기록하거나, 특정 유형의 쿼리만 기록하도록 설정할 수 있습니다.
log_statement = 'all'
3. 로그 백업 및 보관
로그 백업 및 보관 로그 파일이 계속 쌓이는 것을 방지하고, 디스크 공간을 효율적으로 관리하기 위해 로그 파일을 정기적으로 백업하고 보관하는 절차를 마련하는 것이 좋습니다. 예를 들어, logrotate 유틸리티를 사용하여 로그 파일의 주기적인 회전과 백업을 자동화할 수 있습니다.
4.로그 모니터링 및 경고
로그 모니터링 및 경고 로그 파일을 주기적으로 모니터링하고, 오류 발생 시 자동으로 경고를 받을 수 있는 시스템을 설정하는 것이 중요합니다. 예를 들어, 로그 파일의 특정 패턴(예: 오류 메시지)을 모니터링하고 이를 이메일로 알림받도록 설정할 수 있습니다.
5.성능 모니터링
성능 모니터링 PostgreSQL의 성능을 모니터링하기 위해 pg_stat_statements 확장을 활용할 수 있습니다. 이 확장은 쿼리 성능에 대한 통계를 제공하여, 느린 쿼리나 자주 실행되는 쿼리를 식별하는 데 도움이 됩니다.
CREATE EXTENSION pg_stat_statements;
**6.JSON 및 CSV로그 형식
JSON 및 CSV 로그 형식 JSON이나 CSV 형식으로 로그를 설정하면 로그 데이터 분석 및 처리에 유용할 수 있습니다. JSON 형식의 로그는 구조적 데이터를 포함하므로, 로그 분석 및 시각화 도구와의 호환성이 좋습니다.
log_destination = 'csvlog'
7.로그 라인 접두사 설정
로그 라인 접두사 설정 로그의 가독성을 높이기 위해 log_line_prefix를 조정할 수 있습니다. 예를 들어, 접두사에 클라이언트 IP 주소나 세션 ID를 추가하여 문제 발생 시 어떤 클라이언트가 영향을 받았는지 쉽게 식별할 수 있습니다.
log_line_prefix = '%t [%p] %u@%d %a %h '
이러한 추가적인 설정과 팁들을 고려하여 PostgreSQL의 로그를 보다 효과적으로 관리하고 모니터링할 수 있습니다.
https://betterstack.com/community/guides/logging/how-to-start-logging-with-postgresql/