PostgreSQL 로그 완전 정복: 성능 튜닝과 문제 해결의 핵심

이세현·2024년 9월 17일
0

Postgresql_Monitoring

목록 보기
7/8

PostgreSQL 로그 관리 완벽 가이드

PostgreSQL은 전 세계에서 널리 사용되는 강력한 데이터베이스 관리 시스템입니다. 데이터베이스를 운영하면서 발생하는 각종 이벤트나 오류를 기록하는 로그는 시스템 관리와 성능 튜닝에 중요한 역할을 합니다. 이 글에서는 PostgreSQL 로그 시스템의 기초부터 설정 방법, 커스텀 로그 생성, 분석 도구 활용까지 다루어 초보자들도 쉽게 이해할 수 있도록 설명하겠습니다.


1. 로그란 무엇인가?

로그(log)는 데이터베이스에서 발생한 일련의 활동이나 이벤트를 기록한 파일입니다. 시스템에서 무슨 일이 일어났는지 알 수 있도록 돕는 일종의 기록부라고 할 수 있습니다. 데이터베이스에 연결하거나 쿼리를 실행하는 등의 모든 활동은 로그에 기록될 수 있습니다. 이 기록을 통해 문제가 발생했을 때 원인을 분석하거나, 시스템 성능을 모니터링할 수 있습니다.

로그는 특히 대규모 데이터베이스 환경에서 중요합니다. 데이터베이스가 느려지거나, 장애가 발생했을 때, 로그는 문제를 파악하고 해결하는 데 있어 가장 중요한 도구 중 하나입니다.

2. PostgreSQL의 로그 레벨 (Message Severity Levels)

PostgreSQL은 각 로그 메시지에 대해 ‘심각도(severity)’를 설정할 수 있습니다. 이는 메시지가 얼마나 중요한지를 나타내며, 아래와 같은 여러 레벨이 있습니다.

  • DEBUG5 - DEBUG1: 문제 해결을 위한 상세 정보를 기록합니다. DEBUG5가 가장 많은 정보를 기록하며, DEBUG1은 비교적 적은 정보를 기록합니다. 주로 개발 환경에서 사용됩니다.
  • INFO: 사용자가 암시적으로 요청한 정보를 기록합니다. 예를 들어, 테이블을 수정하거나 데이터를 삽입한 결과와 같은 내용이 기록됩니다.
  • NOTICE: 시스템이 사용자에게 알려야 할 유용한 정보를 기록합니다. 테이블 이름이 너무 길어서 자동으로 줄어드는 경우 등의 메시지를 확인할 수 있습니다.
  • WARNING: 잠재적으로 문제가 될 수 있는 상황을 경고합니다. 예를 들어, 트랜잭션 외부에서 COMMIT을 시도하는 경우 경고 메시지가 남을 수 있습니다.
  • ERROR: 쿼리가 실패했을 때 발생하는 오류를 기록합니다. ERROR 레벨 메시지가 발생하면 해당 명령어는 중단됩니다.
  • LOG: 데이터베이스의 일반적인 활동을 기록합니다. 사용자가 직접 명시적으로 요청한 작업뿐 아니라 시스템에서 발생하는 주요 이벤트도 포함됩니다.
  • FATAL: 세션을 중단시키는 심각한 오류를 기록합니다. FATAL 레벨 메시지가 발생하면 해당 세션은 종료됩니다.
  • PANIC: 시스템 자체가 정상적으로 작동할 수 없는 치명적인 오류를 기록합니다. PANIC 오류가 발생하면 모든 세션이 중단되고 데이터베이스가 재시작됩니다.

이 로그 레벨은 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이 클라이언트 연결을 받아들이고, 쿼리 오류가 발생했으며, 심각한 오류로 인해 데이터베이스 시스템이 중단되었음을 보여줍니다.

3. 로그 메시지의 상세도 조정 (Reducing Log Verbosity)

PostgreSQL의 로그 설정을 통해 메시지의 상세도를 조절할 수 있습니다. log_error_verbosity 설정은 로그에 포함될 정보의 양을 결정합니다. 이 설정에는 세 가지 옵션이 있습니다

  • terse: 간결한 로그 메시지만 남깁니다. 오류 메시지만 기록하고, 추가적인 세부 정보는 생략됩니다.
  • default: 기본 설정으로, 메시지와 함께 추가적인 정보를 기록합니다. DETAIL, HINT, QUERY, CONTEXT 같은 유용한 정보가 포함됩니다.
  • verbose: 가장 상세한 로그 메시지를 기록합니다. 메시지와 함께 소스 코드 파일 이름, 함수 이름, 줄 번호 등의 추가 정보도 기록됩니다.

예를 들어, 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 정보는 생략되고, 더 간결한 메시지만 남게 됩니다.

4. 로그 파일 위치와 관리

PostgreSQL 로그는 서버에서 지정된 디렉토리에 저장됩니다. 기본적으로 PostgreSQL은 표준 출력(stderr)이나 파일로 로그를 남기며, 로그 파일의 경로는 PostgreSQL 설정 파일(postgresql.conf)에서 log_directory와 log_filename을 통해 지정할 수 있습니다.

log_directory = '/var/log/postgresql'
log_filename = 'postgresql-%a.log'

위의 설정은 PostgreSQL 로그가 /var/log/postgresql 디렉토리에 저장되고, 요일별로 다른 로그 파일이 생성됨을 의미합니다.

5. 연결 및 해제 로그 관리 (Logging Connections and Disconnections)

로그 설정에서 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에서 데이터베이스에 접속했는지 추적할 수 있기 때문입니다.

6. 커스텀 로그 메시지 생성 (Creating Custom Log Messages)

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

7. PgBadger를 이용한 로그 분석 (Analyzing Log Files with PgBadger)

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 형식의 로그는 지원하지 않으므로 주의해야 합니다.

8. 로그 최적화 팁

  • 불필요한 로그 줄이기: 너무 많은 로그는 분석을 복잡하게 만듭니다. log_min_duration_statement를 설정하여 일정 시간 이상 걸린 쿼리만 로그로 남기도록 조정할 수 있습니다.
  • 로그 보관 설정: log_rotation_size와 log_rotation_age 설정을 통해 일정 용량이나 시간에 따라 로그 파일을 회전(rotating)시키면 로그 파일 크기를 적절히 유지할 수 있습니다.
  • 로그 백업: 로그는 문제 해결을 위한 중요한 자료입니다. 일정 기간 동안 로그 파일을 보관하고 백업해두는 것이 좋습니다.

마무리

PostgreSQL의 로그는 데이터베이스를 모니터링하고, 문제를 진단하며, 성능을 최적화하는 데 매우 중요한 역할을 합니다. 이 글에서 설명한 로그 설정과 활용법을 잘 이해하고 적용하면 더 안정적이고 효율적인 데이터베이스 운영이 가능합니다. 초보자라도 천천히 따라해보며 자신의 데이터베이스 로그를 잘 관리해보세요. 문제가 발생했을 때 빠르게 원인을 찾을 수 있을 것입니다.

profile
pglover_12

0개의 댓글