JuBin's personal study blog

PostgreSQL Log 설정하기 본문

DataBase

PostgreSQL Log 설정하기

JuBin 2021. 1. 11. 14:06
반응형

# PostgreSQL Log에 대한 기본 설정은 대부분 postgresql.conf > ERROR REPORTING AND LOGGING  section에서 이루어진다.

 

       * postgresql.conf 파일의 경로는 ubuntu, postgreSQL10버전 같은 경우 /etc/postgresql/10/main 밑에 있다.

 

# Log는 'Where to Log', 'When to Log', 'What to Log' 파트로 나누어진다.

 


## Where to Log

 

# where to log에서 제일 중요한 설정 값은 log_destination 이다.

아래는 log_destination 값과 그에 값에 연관된 paramenter 값을 표로 정리해 놓았다.

 

 

log_destination

 'stderr'

'csvlog'

'syslog'

 eventlog

종속 parameter

  • logging_collector : 이 값이 'on'일 때 하위 parameter들이 필요.
    • log_directory
    • log_filename
    • log_file_mode
    • log_rotation_age
    • log_rotation_size
    • log_truncate_on_rotation
  • syslog_facility
  • syslog_ident
  • syslog_sequence_numbers
  • syslog_split_messages
  •  event_source

 지원 OS

 Window, Linux 공통

Linux Only

Window Only

특징

 Local Path 에서 Standard Error Format으로 남겨짐.

 Local Path에서 CSV Format으로 남겨짐. Log를 DB로 관리할 때 유용.

 Linux System Log로 관리

Window Service Log로 관리

[ log_destination 값과 파라미터 ]

 

# stderr, csvlog

 

 stderrText형태로 로그를 저장하고 csvlog는 로그를 csv형태로 저장해서 추후에 DB로 Import 해서 관리할 때 사용한다. 각각의 로그 내용은 아래의 예와 같다. (csvlog는 사용자가 Log 내용을 바로 인지하기 어렵기 때문에 DB Import 과정이 필수적이다)

 

 stderr는 log_directory 경로에 .log 파일로, csvlog는 .csv 파일로 떨어진다.

 

 

 'stderr', 'csvlog'로 설정했을 때 영향을 주는 다른 설정 값들은 아래와 같다.

  • logging_collector : Log를 파일로 남길 지 여부를 나타내며 'csvlog' 방식으로 Log를 남길 때는 필수적으로 'on'으로 설정해야 한다.
  • log_directory : logging_collector가 on일 경우에 log file path를 나타낸다. 절대 경로를 입력하지 않을 경우 PGDATA path의 상대 경로로 지정된다. 기본 값은 PGDATA path 하위의 pg_log folder에 log file을 생성하게 되어 있다.
  • log_filename : logging_collector가 on일 경우에 log file name을 나타낸다. % character를 이용해서 시간 정보에 따라 Log File Name을 지정하게 되고 이때 사용되는 문법은 Open Group의 strftime 규칙을 따른다. 기본 값은 'postgresql-%a.log' 이고 요일에 따라 file name이 명명된다. (ex. postgresql-Mon.log, postgresql-Sun.log)
  • log_file_mode : Unix 시스템에서 Log 파일의 권한 설정할 때 사용되며 chmod 명령에서 사용하는 값과 동일한 의미이다. 기본값 600은 root만 read/write 할 수 있게 설정한 값이다. (단, Window에서 postgresql을 운영할 때는 이 값이 무시된다.)
  • log_rotation_age : 시간 기준으로 Log 파일을 나눌 때 시간 값을 정의한다. 숫자는 분단위를 의미하며 시간이나 일자를 기준으로 Log 파일을 작성하고 싶으면 숫자 뒤에 'h'나 'd'를 붙히면 된다. 예를 들어 매일마다 새로운 Log 파일을 작성할 때는 1440, 24h, 1d로 설정하면 된다. (물론 log_filename과 뒤에 언급할 log_truncate_on_rotation 값이 유의미하게 설정되어야 한다.) 0일 경우에는 이 설정을 사용하지 않게 된다.
  • log_rotation_size : Log File Size 기준으로 Log 파일을 나눌 때 Size 값을 정의한다. 그냥 숫자를 사용할 때는 kb 단위를 의미하고 MB, GB와 같은 단위를 명시해서 큰 Size로 설정할 수 있다. 값이 0일 경우에는 이 설정을 사용하지 않게 된다. 
  • log_truncate_on_rotation : 전체 Log File의 크기를 어느 정도 제한하고 싶을 때 사용하는 기능이다. 이 기능을 사용하게 되면 log_rotation_age에 설정한 값에 따라 일정 시간이 지난 같은 이름을 가진 Log File은 기존 내용이 없어지고 새로운 Log로 Over Write하게 된다. 가령 log_filename을  'postgresql-%a.log'으로 설정하고 log_rotation_age를 7d로 설정하게 되면 지난주 월요일에 만들어진 Log 파일 postgresql-mon.log에 있는 내용은 이번 주 월요일에 생기는 신규 Log들로 Overwrite되면서 내용이 없어지게 된다. Postgresql은 과거 Log를 삭제하는 기능이 없기 때문에 Log 증가에 따른 저장 공간 문제를 방지하려면 이 기능을 활용하는 것이 좋다.

 

 

# syslog

log_destination을 'syslog'로 설정하면 Linux System Log에 저장되게 된다. 

Ubuntu 같은 경우에 /var/log/syslog 파일에 쌓인다.

 

  • syslog_facility : syslog에서 Log를 기록할 때 사용하는 Program들을 구분하기 위해 설정하는 값으로 LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7 들을 사용할 수 있다. 예를 들어 PostgreSQL Log를 System Log로 별도로 관리하고 싶은 경우 아래와 같이 설정할 수 있다.
  • syslog_ident : System Log로 Log가 저장될 때 Log를 찍는 Process를 식별하기 위해 사용되며 기본값은 'postgres'이다. 이 값을 변경하면 위에 보이는 Log에서 localhost 뒤에 오는 postgres라는 단어가 변경되서 Log를 남기게 된다. 
  • syslog_sequence_number : Log의 일련 번호를 기록해서 남길지 여부를 설정. 기본 값은 on이며 off로 변경하게 되면 위에 보여지는  Log들 중에 [3-1], [4-1]과 같은 Format이 [1], [1] 만 남게 된다.
  • syslog_split_message : System Log를 1024Byte 제한에 맞춰 Split해서 기록할 지 여부를 설정. 기본 값은 on이며 off로 변경하게 되면 위의 Log에서 HINT라는 단어로 이어지는 Split된 부분이 이어서 출력 되게 된다.

 

## When to Log

When to Log Section은 PostgreSQL이 Log를 남기는 조건을 말한다.

설정사항은 log_min_messages, log_min_messages_statement, log_min_duration_statement 3가지가 있다.

 

  • log_min_messages, log_min_messages_statement : log_min_messages어떤 Level의 Message를 남길까를 설정한다. Default값은 warning이고, 이 경우 warning, error, log, fatal, panic level의 message가 모두 남기 때문에 default값을 그대로 사용해도 괜찮다. (Log level의 message가 모두 남기 때문에 그렇다.) 혹시 cross-compile 작업 이상으로 Code를 건드릴 일이 있으면 Debug Level으로 설정해야할 것이다. log_min_messages_statement실행되는 Query를 어떤 Level에 Log에 남길 지를 설정한다. 역시 Default값인 'error'면 충분하다고 생각한다. 
  • log_min_duration_statement : 성능 및 Query Tuning 시에 가장 중요한 설정 중에 하나이다. 여기서 설정한 시간(단위는 milli-second)이상이 소요되는 Query들과 그 소요시간을 Log에 남긴다. -1로 설정하면 아무런 Log도 안남기게 되고 0일 경우에는 모든 Log를 남긴다. 단위는 ms로 ex) 500으로 설정 시 500ms 이상 걸리는 쿼리에 대한 내용과 소요 시간 정보를 보여준다.

 


## What to Log

log_line_prefixlog_statement가 매우 중요한 설정

이 값을 잘 설정해야 추후에 Log를 통해 Trouble Shooting이나 튜닝 작업을 수월하게 수행할 수 있다.

 

  • log_line_prefix : log_destination을 'stderr'로 설정했을 때, 발생하는 Log들의 접두어를 설정할 수 있다. Option이 매우 다양하기 때문에 공식 문서에서 Option을 확인해 보는 것을 권장하며 기본 값은 '<%m>'으로 millisecond를 포함한 Time Stamp를 Log 앞에 남긴다. (참고로, csvlog와 syslog의 경우에는 기본적으로 Time Stamp를 남긴다.) 필자는 사용하지 않았지만 Log 분석 Tool Project로 유명한 pgFouine에서는 다음 설정을 권장하고 있다.

log_line_prefix = '%t [%p]: [%l-1] '                                                    // 시간, Process ID, Session Line Number
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d'                             //      + 접근 유저, Database 명
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,remote=%r'             //              + 접속한 위치

 

%u User name 
%d Database name 
%r Remote host name or IP address, and remote port 
%h Remote host name or IP address 
%p Process ID 
%t Time stamp without milliseconds 
%m Time stamp with milliseconds 
%i Command tag: type of session's current command 
%c Session ID: see below 
%l Number of the log line for each session or process, starting at 1 
%s Process start time stamp 
%v Virtual transaction ID (backendID/localXID) 
%x Transaction ID (0 if ne is assigned) 
%q Produces  output, but tells n-session processes to stop at this point in the string; igred by session processes 
%% Literal %


 

  • log_statement : Query Log를 어느 수준으로 남길지 설정한다. none, ddl, mod, all 값이 들어갈 수 있고 Default는 'none'이다. none은 Query를 남기지 않는 것이며, ddl은 Table Create나 Drop과 같이 구조 변경을 하는 Query 이상을 Log 로 남기고, 'mod'는 Data Record 단위로 변경을 하는 Query 이상을 log로 남긴다. 'all'은 모든 Query가 Log로 남긴다고 생각하면 된다.

 

  • debug_print_parse, debug_print_rewritten, debug_print_plan : 이 3개의 옵션은 일반적인 경우에 사용하기 보다는 매우 느리게 동작하는 Query가 목격되었을 때 해당 Query가 어떻게 해석되고 어떤 Plan으로 동작하는 지 확인하려고 할 때 사용하는 설정값이다. 기본 값은 'off'로 되어 있고, on으로 설정할 경우 Log의 양이 폭증할 가능성이 높기 때문에 주의하여야 한다.

 

  • debug_pretty_print : 위 3개의 option이 매우 많은 Log를 발생시키기 때문에, 그 Log 양을 조금이나마 줄이고 싶을 때 사용하는 설정값이다. 기본 값은 'on'인데 'off'로 설정하면 Space와 New Line Character가 없어지면서 약간이나마 Log양이 줄게된다. (하지만 Readibility가 낮아지게 된다.) 아래는 debug_print_plan을 on으로 설정했을 때 (debug_pretty_print는 'ON') 발생하는 Log의 일부분이다.

 

  • log_connections, log_disconnections ; DB에 오는 Connection/Disconnection Request와 그 결과를 Log에 남김

 

  • log_duration ; 실행되는 Query들의 실행시간을 Log로 남긴다. 기본값은 'off'이다. 일반적으로 모든 Query에 실행 시간을 남기기 보다는 일정 시간 이상 소요되는 Query를 분석하려 하기 때문에, log_duration 설정 보다는  log_min_duration_statement 설정을 사용한다.

등등 여러가지가 있지만 여기까지만.

 


## 기타

 

그리고 'ERROR REPORTING AND LOGGING' section에 포함되는 설정 항목은 아니지만 Log File에 중요 정보를 남기거나 Log에 영향을 미치는 항목들이 더 있으니 참고 삼아 아래 내용도 알아두면 좋을 것 같다.

 

  • log_parser_stats, log_planner_stats, log_executor_stats, log_statement_stats : Runtime 시에 Query를 실행하는 과정에서 사용하는 CPU와 소요 시간, I/O 정보, Memory 사용 정보 등을 보여줄 지 여부를 설정한다. (기본값은 'off'이다) log_parser_stats, log_planner_stats, log_executor_stats은 Query 실행 시 각 단계의 통계치를 나누어서 Log로 남기고, log_statement_stats종합해서 Log를 남긴다. log_parser_stats, log_planner_stats, log_executor_stats들은 log_statement_stats와 동시에 사용하는 것으로 설정할 수 없다.

 

 

 

출처 : browndwarf.tistory.com/16

반응형