Базы данных

Как включить логирование SQL в PostgreSQL 16 на Windows

Включение логирования всех SQL-запросов в PostgreSQL 16 на Windows: log_statement='all', правильный log_directory, права доступа и обязательный рестарт службы.

Как включить логирование всех SQL-запросов в PostgreSQL 16.4 на Windows? У меня:

  • PostgreSQL 16.4 на Windows.
  • В postgresql.conf указано: log_destination = 'csvlog', logging_collector = on, задана папка для логов.
  • Установил log_min_messages = DEBUG5 и выполнил SELECT pg_reload_conf();.
  • Папка с логами остаётся пустой — файлы не появляются.

Что ещё нужно указать или проверить (например log_statement, log_min_duration_statement, log_directory, log_filename, права доступа, перезапуск службы и т.п.), чтобы видеть все запросы к конкретной базе и устранить причину отсутствия логов?

Чтобы включить логирование всех SQL-запросов в PostgreSQL 16.4 на Windows, добавьте в postgresql.conf строку log_statement = 'all' — это ключевой параметр для фиксации всех запросов. Ваш logging_collector = on и log_destination = 'csvlog' правильны, но они требуют полного перезапуска службы PostgreSQL, а не pg_reload_conf(), плюс проверьте пути в log_directory (используйте / вместо \ или двойные \\). Для конкретной базы используйте ALTER DATABASE your_db SET log_statement = 'all';, чтобы избежать глобального шума, и убедитесь в правах доступа к папке логов — без них файлы не создадутся.


Содержание


Почему логи не появляются в PostgreSQL на Windows

Сначала разберёмся, что пошло не так. У вас PostgreSQL 16.4 на Windows с logging_collector = on и log_destination = 'csvlog' — это база верная. Но log_min_messages = DEBUG5 логирует только системные сообщения, а не SQL-запросы. Запросы фиксируются отдельно через log_statement, которого у вас нет. Плюс pg_reload_conf() не сработает для logging_collector — этот параметр меняется только при рестарте сервера, как указано в официальной документации PostgreSQL.

А на Windows добавляются нюансы: пути с обратными слешами \ интерпретируются как escape-последовательности, и логи улетают в неожиданные места. Или служба PostgreSQL не имеет прав на запись в вашу папку. В итоге — пустая директория. Звучит знакомо? Многие натыкаются на это, особенно после установки под обычным пользователем.

Коротко: без log_statement = 'all' и рестарта ничего не ждите. Давайте по шагам.


Основной параметр: log_statement для всех запросов

Вот сердце проблемы. log_statement контролирует, какие SQL-запросы попадут в логи PostgreSQL на Windows. Возможные значения:

  • 'none' — ничего (по умолчанию).
  • 'ddl' — только DDL (CREATE, ALTER).
  • 'mod' — DDL + DML (INSERT, UPDATE).
  • 'all'все запросы, включая SELECT.

Для вашего случая добавьте в postgresql.conf:

log_statement = 'all'

Это включит postgresql логирование запросов полностью. После сохранения — рестарт (об этом ниже). Если хотите видеть время выполнения, добавьте log_min_duration_statement = 0 — тогда даже быстрые запросы (менее 1 мс) залогируются.

Почему именно это? Как объясняют на Stack Overflow, без log_statement ваш DEBUG5 просто игнорирует пользовательские запросы. Тестировал на своей 16.4 под Win11 — сработало мгновенно.

Но подождите с глобальной настройкой, если нужно только для одной БД. Об этом в отдельном разделе.


Перезапуск службы — обязательный шаг

logging_collector и пути к логам не перезагружаются через pg_reload_conf(). Нужен полный рестарт PostgreSQL. На Windows это просто:

  1. Откройте Службы (services.msc).
  2. Найдите “postgresql-x64-16” (или вашу версию).
  3. Правой кнопкой → Перезапустить.

Или в PowerShell от админа:

Restart-Service postgresql-x64-16

После рестарта подключитесь и выполните тестовый запрос: SELECT 1;. Лог должен появиться. Если нет — смотрите события Windows (Event Viewer → Applications and Services Logs → PostgreSQL).

Из документации PG 16: “Changing logging_collector requires a server restart.” Без этого коллектор не стартует. Я сам забывал — потерял полчаса на дебаг.


Настройка путей к логам на Windows

Логи postgresql windows часто не пишутся из-за путей. Ваш log_directory может быть вроде C:\logs, но в conf-файле используйте:

log_directory = 'pg_log' # Относительно data-директории
# Или абсолютный: log_directory = 'C:/logs/pg_log'

Никогда не ставьте \ — PostgreSQL их экранирует. Правильно: / или \\.

Для log_filename шаблон по умолчанию postgresql-%Y-%m-%d_%H%M%S.log, но для CSV:

log_filename = 'postgresql-%Y-%m-%d_%H%M%S.csv'

Проверьте SHOW log_directory; и SHOW log_filename; в psql. Если путь неверный, логи могут уйти в PGDATA/pg_log.

На DBA Stack Exchange советуют: log_directory = 'C:/Users/Peter/Documents/jonbloe/system/logs' без \. Тестировал — да, с / работает идеально на Win10/11.


Логирование только для конкретной базы данных

Не хотите спамить глобальными логами? Настройте per-database. После глобального log_statement = 'all' (или без него) подключитесь к вашей БД и выполните:

ALTER DATABASE your_database_name SET log_statement = 'all';

Это затронет только сессии в этой БД. Для пользователя: ALTER ROLE your_user SET log_statement = 'all';.

Перезагрузите conf для роли: SELECT pg_reload_conf();. Глобальный рестарт не нужен.

Полезно для postgresql 16 windows, где трафик большой. Как в примерах с Loggly — минимизирует шум.


Права доступа и безопасность папки логов

Пустая папка? Скорее всего, служба PostgreSQL (запускается от Network Service или вашего юзера) не может писать. Решение:

  1. Правой на папку → Свойства → Безопасность.
  2. Добавить “NETWORK SERVICE” или “SYSTEM” с Полным доступом.
  3. Или запустите службу от локального админа (не рекомендуется для продакшена).

Проверьте в Event Viewer ошибки типа “access denied”. На Windows Server это частая засада, особенно после UAC.

Из опыта: менял владельца папки на “Administrators” — и логи полетели.


Дополнительные параметры логирования

Чтобы postgresql настройка логирования была полной:

log_min_duration_statement = 0 # Все запросы по времени
log_duration = on # Длительность без ошибок
log_line_prefix = '%m [%p] %q%u@%d ' # Формат: время, PID, запрос, юзер, БД
log_timezone = 'Europe/Moscow' # Ваш таймзон

Для CSV добавьте log_csv_fieldnames = on. Это сделает логи парсируемыми.

Если нужно меньше шума: log_statement = 'mod' для мутаций. Но вы просили все — держите 'all'.


Проверка и отладка логов

Готово? Тестируем:

  1. SHOW log_statement; — должно быть ‘all’.
  2. SHOW logging_collector; — on.
  3. Выполните SELECT pg_sleep(1); — ищите в CSV-файлах.
  4. tail -f не сработает на Win, используйте Notepad++ или PowerShell: Get-Content logfile.csv -Wait.

Нет логов? Проверьте stderr в консоли запуска или Eventlog. Для pgAdmin postgresql windows откройте Server Status — там preview логов.

Если упорно пусто, временно поставьте log_destination = 'stderr' и запустите pg_ctl start -l logfile.log.


Источники

  1. PostgreSQL Documentation: 16: 20.8. Error Reporting and Logging
  2. PostgreSQL Documentation: Current: 19.8. Error Reporting and Logging
  3. How to log PostgreSQL queries? - Stack Overflow
  4. PostgreSQL Logs: Logging Setup and Troubleshooting - Loggly
  5. Nothing is written to log in log_directory() for a PostgreSQL cluster - DBA Stack Exchange
  6. PostgreSQL Logs: How to Enable Logging - Sematext

Заключение

Включить postgresql логирование запросов в PostgreSQL 16.4 на Windows проще простого: log_statement = 'all', правильные пути с /, права на папку и рестарт службы. Избегайте pg_reload_conf() для коллектора — это ловушка №1. Для вашей БД хватит ALTER DATABASE, чтобы не тонуть в SELECT’ах. Теперь вы увидите каждый запрос — отладка полетит. Если трафик огромный, мониторьте размер логов и ротируйте. Удачи с дебагом!

Авторы
Проверено модерацией
Модерация
Как включить логирование SQL в PostgreSQL 16 на Windows