Документация по настройке логирования PostgreSQL#

1. Введение#

Цель логирования в PostgreSQL — обеспечить возможность мониторинга, отладки, аудита и анализа производительности. Представленная конфигурация ориентирована на два основных сценария использования:

  • Анализ логов с помощью pgBadger (инструмент для построения детальных отчётов на основе логов).

  • Отправка структурированных логов в формате JSON в PostgresPro Enterprise Manager (далее – PPEM).


2. Обзор параметров логирования PostgreSQL#

Основные группы параметров, управляющих логированием:

  • Куда писатьlog_destination, logging_collector.

  • Как хранитьlog_directory, log_filename, ротация, права доступа.

  • Что логировать – уровни сообщений, события (подключения, блокировки, контрольные точки, временные файлы и т.д.).

  • Формат записейlog_line_prefix, log_error_verbosity.

  • Временные зоныlog_timezone, timezone.


3. Описание настроек (конфигурационный файл)#

3.1. Назначение и сбор логов#

log_destination = 'stderr, jsonlog'      # Логи направляются в стандартный поток ошибок и в JSON-формат
logging_collector = on                   # Включает сбор логов в файлы (для stderr)
  • stderr – используется для записи в файлы через встроенный сборщик.

  • jsonlog – выводит логи в структурированном JSON-виде (доступно с PostgreSQL 15+). Эти данные могут быть перенаправлены в системный журнал или обработаны внешними агентами.

3.2. Параметры файлов логов (для stderr)#

log_directory = '/pg_cluster/17/log'             # Каталог для хранения файлов
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'  # Маска имени файла (включает дату и время)
log_file_mode = 0640                             # Права доступа к файлам (владелец – чтение/запись, группа – чтение)
log_rotation_age = 1d                            # Ротация по времени – ежедневно
log_rotation_size = 102400                       # Ротация по размеру – 100 МБ (сработает то, что наступит раньше)
lc_messages = 'en_US.UTF-8'                      # pgBadger не поддерживает локаль ru_RU.UTF-8

Эти параметры обеспечивают удобное хранение и ротацию логов для последующей обработки pgBadger.

3.3. Что и как логируем#

log_min_messages = warning                  # Минимальный уровень сообщений, попадающих в лог
log_min_error_statement = error             # Минимальный уровень ошибок, при которых в лог добавляется текст запроса
log_checkpoints = on                        # Логировать начало и завершение контрольных точек
log_connections = on                        # Логировать все попытки подключения
log_disconnections = on                     # Логировать завершения соединений
log_lock_waits = on                         # Логировать ожидания блокировок дольше deadlock_timeout
log_temp_files = 0                          # Логировать создание всех временных файлов (0 – все)
log_autovacuum_min_duration = 0             # Логировать каждое действие autovacuum (0 – все)
log_error_verbosity = default               # Степень детализации сообщений об ошибках (по умолчанию – сообщение + детали)

Эти настройки дают pgBadger полную картину о событиях в базе: подключения, блокировки, работа autovacuum, временные файлы и т.д.

3.4. Формат строки лога (для stderr)#

log_line_prefix = '%t [%p]: user=%u,db=%d,app=%a,client=%h '

Содержит:

  • %t – метка времени с миллисекундами,

  • %p – PID процесса,

  • %u – имя пользователя,

  • %d – имя базы данных,

  • %a – имя приложения,

  • %h – клиентский хост.

Такой префикс необходим для корректного парсинга pgBadger (он позволяет идентифицировать контекст каждого события).

3.5. Часовые пояса#

log_timezone = 'Europe/Moscow'
timezone = 'Europe/Moscow'

Единая временная зона для сервера и логов упрощает анализ и сопоставление событий.


4. Мониторинг производительности с помощью расширения pg_stat_statements#

Для сбора детальной статистики о выполнении запросов и мониторинга производительности PostgreSQL используются следующие параметры:

# Monitoring
shared_preload_libraries = 'pg_stat_statements'    # Загрузка расширения для сбора статистики по запросам
track_io_timing = on                               # Измерение времени операций ввода-вывода (блоков)
track_functions = pl                               # Отслеживание времени выполнения функций на процедурных языках (PL/pgSQL и др.)
track_activity_query_size = 51200                  # Максимальный размер текста запроса, сохраняемого в представлении pg_stat_activity

4.1. pg_stat_statements#

Расширение pg_stat_statements предоставляет агрегированную статистику по выполнению SQL-запросов: количество вызовов, общее время, время CPU, время чтения/записи блоков, количество возвращаемых строк и т.д.

Для включения:

  • Параметр shared_preload_libraries требует перезапуска сервера PostgreSQL.

  • После перезапуска необходимо создать расширение в нужной базе данных:

    CREATE EXTENSION pg_stat_statements;
    

4.2. track_io_timing#

Параметр track_io_timing = on включает измерение времени, затраченного на операции ввода-вывода (чтение и запись блоков данных). Эта информация появляется в представлениях pg_stat_statements (колонки blk_read_time и blk_write_time) и pg_stat_database.

Зачем:

  • Позволяет отличить запросы, которые долго выполняются из-за медленного диска, от запросов, нагружающих CPU.

  • Помогает диагностировать проблемы с подсистемой хранения.

Влияние: Включение добавляет небольшие накладные расходы на каждый запрос, но они обычно незаметны. Требует перезагрузки конфигурации (pg_reload_conf()).

4.3. track_functions#

Параметр track_functions = 'pl' включает сбор статистики о времени выполнения функций, написанных на процедурных языках (PL/pgSQL, PL/Python, PL/Perl и др.). Доступные значения:

  • none – не отслеживать (по умолчанию).

  • pl – отслеживать только функции на процедурных языках.

  • all – отслеживать также функции на SQL и C.

Использование:

  • Статистика доступна в представлении pg_stat_user_functions.

  • Позволяет обнаружить медленные пользовательские функции и оптимизировать их.

Примечание: Для применения требуется перезагрузка конфигурации. Накладные расходы минимальны при установке 'pl'.

4.4. track_activity_query_size#

Параметр track_activity_query_size задаёт объём памяти, резервируемой для хранения текста выполняемой в данной момент команды в каждом активном сеансе, для поля pg_stat_activity.query. Если это значение задаётся без единиц измерения, оно считается заданным в байтах. Значение по умолчанию — 1024 байта. Задать этот параметр можно только при запуске сервера.

Зачем:

  • При мониторинге активных сессий важно видеть полный текст запроса, особенно при отладке долгих операций.

  • Увеличение размера помогает точно идентифицировать запросы без обрезания.


5. Применение конфигурации и проверка#

5.1. Внесение изменений в конфигурационный файл#

Все описанные параметры (логирование и мониторинг) должны быть добавлены в postgresql.conf. После редактирования файла необходимо применить изменения.

5.2. Применение изменений#

  • Для параметров, не требующих перезапуска (большинство параметров логирования, track_io_timing, track_functions), достаточно выполнить:

    SELECT pg_reload_conf();
    
  • Для параметров, требующих перезапуска (shared_preload_libraries, track_activity_query_size), необходим полный перезапуск сервера PostgreSQL:

    sudo systemctl restart postgresql
    

5.3. Проверка настроек логирования#

  1. Убедитесь, что каталог для логов существует и доступен для записи пользователем postgres:

    ls -la /pg_cluster/17/log/
    
  2. После перезагрузки/перезапуска проверьте, что файлы логов создаются:

    ls -la /pg_cluster/17/log/postgresql-*.log
    
  3. Выполните тестовое подключение и запрос:

    psql -c "SELECT 1"
    
  4. Просмотрите содержимое лог-файла – должны появиться записи о подключении и выполнении запроса с настроенным префиксом.


6. Пример блока с конфигурацией логирования#

# -----------------------------------------------------------------------------
# REPORTING AND LOGGING
# -----------------------------------------------------------------------------

shared_preload_libraries = 'pg_stat_statements'        # Preload extension
lc_messages = 'en_US.UTF-8'              # Language for error messages (English)

# Log Destination and Collection
log_destination = 'stderr, jsonlog'               # Send logs to standard error
logging_collector = on                   # Enable log file collection

# Log File Settings
log_directory = '/pg_cluster/17/log'     # Directory for log files
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # Log file naming pattern
log_file_mode = 0640                     # File permissions for logs (owner read/write)
log_rotation_age = 1d                    # Rotate logs daily
log_rotation_size = 102400               # Rotate logs 100 mB   

# What to Log
log_min_messages = warning                # Minimum message level to log (debug1 = very verbose)
log_min_error_statement = error          # Minimum error level to log statement
log_checkpoints = on                     # Log checkpoint activity
log_connections = on                     # Log connection attempts
log_disconnections = on                  # Log disconnections
log_lock_waits = on                      # Log long lock waits
log_temp_files = 0                       # Log all temporary file creations
log_autovacuum_min_duration = 0          # Log all autovacuum actions
log_error_verbosity = default            # Verbosity of error messages

# Log Format
log_line_prefix = '%t [%p]: user=%u,db=%d,app=%a,client=%h ' # Enhanced log format

# Time Settings
log_timezone = 'Europe/Moscow'           # Timezone for log timestamps
timezone = 'Europe/Moscow'               # Server timezone

# -----------------------------------------------------------------------------
# STATISTICS
# -----------------------------------------------------------------------------

track_io_timing=on        # measure exact block IO times
track_functions=pl        # track execution times of pl-language procedures if any
track_activity_query_size = 51200         # Size of query text tracked per connection