PostgreSQL은 전 세계에서 널리 사용되는 강력한 데이터베이스 관리 시스템입니다. 데이터베이스를 운영하면서 발생하는 각종 이벤트나 오류를 기록하는 로그는 시스템 관리와 성능 튜닝에 중요한 역할을 합니다. 이 글에서는 PostgreSQL 로그 시스템의 기초부터 설정 방법, 커스텀 로그 생성, 분석 도구 활용까지 다루어 초보자들도 쉽게 이해할 수 있도록 설명하겠습니다.
로그(log)는 데이터베이스에서 발생한 일련의 활동이나 이벤트를 기록한 파일입니다. 시스템에서 무슨 일이 일어났는지 알 수 있도록 돕는 일종의 기록부라고 할 수 있습니다. 데이터베이스에 연결하거나 쿼리를 실행하는 등의 모든 활동은 로그에 기록될 수 있습니다. 이 기록을 통해 문제가 발생했을 때 원인을 분석하거나, 시스템 성능을 모니터링할 수 있습니다.
로그는 특히 대규모 데이터베이스 환경에서 중요합니다. 데이터베이스가 느려지거나, 장애가 발생했을 때, 로그는 문제를 파악하고 해결하는 데 있어 가장 중요한 도구 중 하나입니다.
PostgreSQL은 각 로그 메시지에 대해 ‘심각도(severity)’를 설정할 수 있습니다. 이는 메시지가 얼마나 중요한지를 나타내며, 아래와 같은 여러 레벨이 있습니다.
이 로그 레벨은 PostgreSQL 서버의 log_min_messages 설정을 통해 조절할 수 있습니다. 기본값은 WARNING이며, 이는 경고 이상의 심각도를 가진 메시지만 기록한다는 뜻입니다.
/etc/postgresql/15/main/postgresql.conf
log_min_messages = warning
LOG: connection received: host=[local]
ERROR: relation "albu" does not exist at character 7
FATAL: role "root" does not exist
PANIC: database system shutdown requested
위와 같은 메시지는 PostgreSQL이 클라이언트 연결을 받아들이고, 쿼리 오류가 발생했으며, 심각한 오류로 인해 데이터베이스 시스템이 중단되었음을 보여줍니다.
PostgreSQL의 로그 설정을 통해 메시지의 상세도를 조절할 수 있습니다. log_error_verbosity 설정은 로그에 포함될 정보의 양을 결정합니다. 이 설정에는 세 가지 옵션이 있습니다
예를 들어, DROP TABLE 쿼리가 실패한 경우 기본 로그 메시지는 다음과 같습니다.
LOG: statement: DROP table album;
ERROR: cannot drop table album because other objects depend on it
DETAIL: constraint fk_trackalbumid on table track depends on table album
HINT: Use DROP ... CASCADE to drop the dependent objects too.
STATEMENT: DROP table album;
만약 log_error_verbosity를 terse로 설정하면 DETAIL과 HINT 정보는 생략되고, 더 간결한 메시지만 남게 됩니다.
PostgreSQL 로그는 서버에서 지정된 디렉토리에 저장됩니다. 기본적으로 PostgreSQL은 표준 출력(stderr)이나 파일로 로그를 남기며, 로그 파일의 경로는 PostgreSQL 설정 파일(postgresql.conf)에서 log_directory와 log_filename을 통해 지정할 수 있습니다.
log_directory = '/var/log/postgresql'
log_filename = 'postgresql-%a.log'
위의 설정은 PostgreSQL 로그가 /var/log/postgresql 디렉토리에 저장되고, 요일별로 다른 로그 파일이 생성됨을 의미합니다.
로그 설정에서 log_connections와 log_disconnections 옵션을 통해 클라이언트 연결 및 해제 로그를 관리할 수 있습니다. 기본적으로 이 옵션들은 비활성화되어 있으며, 이를 활성화하면 사용자가 언제 데이터베이스에 연결하고 해제했는지 기록할 수 있습니다.
log_connections = on
log_disconnections = on
LOG: connection received: host=[local]
LOG: disconnection: session time: 0:00:02.824 user=postgres database=chinook host=[local]
이 정보는 보안 관점에서 유용합니다. 누가, 언제, 어떤 IP에서 데이터베이스에 접속했는지 추적할 수 있기 때문입니다.
PostgreSQL에서 PL/pgSQL을 사용하면 쿼리나 트리거 함수에서 직접 로그 메시지를 생성할 수 있습니다. RAISE 구문을 사용하여 로그 메시지를 남길 수 있으며, 이는 개발 중 디버깅이나 운영 중 중요한 정보를 남기고자 할 때 유용합니다.
CREATE OR REPLACE FUNCTION custom_logs_func()
RETURNS TRIGGER LANGUAGE PLPGSQL AS $$
BEGIN
RAISE LOG 'This is an informational message';
RAISE WARNING 'Something unexpected happened';
RAISE EXCEPTION 'An unexpected error occurred';
END;
$$;
CREATE TRIGGER album_update
BEFORE UPDATE ON album
FOR EACH ROW EXECUTE FUNCTION custom_logs_func();
LOG: This is an informational message
WARNING: Something unexpected happened
ERROR: An unexpected error occurred
PgBadger는 PostgreSQL 로그를 분석하고, 다양한 성능 지표를 시각화할 수 있는 도구입니다. PgBadger는 로그 파일을 읽어들여 데이터베이스 활동과 성능, 쿼리 효율성을 분석한 후 HTML 형식의 보고서를 생성합니다.
PgBadger는 특히 느린 쿼리를 찾아내거나, 데이터베이스 연결 빈도, 오류 메시지 발생 빈도 등을 파악할 때 매우 유용합니다.
pgbadger --prefix 'time=%m pid=%p user=%u db=%d app=%a ' /var/log/postgresql/postgresql-Wed.log -o report.html
PgBadger는 CSV나 stderr 포맷 로그와 호환되며, JSON 형식의 로그는 지원하지 않으므로 주의해야 합니다.
PostgreSQL의 로그는 데이터베이스를 모니터링하고, 문제를 진단하며, 성능을 최적화하는 데 매우 중요한 역할을 합니다. 이 글에서 설명한 로그 설정과 활용법을 잘 이해하고 적용하면 더 안정적이고 효율적인 데이터베이스 운영이 가능합니다. 초보자라도 천천히 따라해보며 자신의 데이터베이스 로그를 잘 관리해보세요. 문제가 발생했을 때 빠르게 원인을 찾을 수 있을 것입니다.