Документация по настройке логирования 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. Проверка настроек логирования#
Убедитесь, что каталог для логов существует и доступен для записи пользователем postgres:
ls -la /pg_cluster/17/log/
После перезагрузки/перезапуска проверьте, что файлы логов создаются:
ls -la /pg_cluster/17/log/postgresql-*.log
Выполните тестовое подключение и запрос:
psql -c "SELECT 1"
Просмотрите содержимое лог-файла – должны появиться записи о подключении и выполнении запроса с настроенным префиксом.
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