Как включить логирование 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
- Основной параметр: log_statement для всех запросов
- Перезапуск службы — обязательный шаг
- Настройка путей к логам на Windows
- Логирование только для конкретной базы данных
- Права доступа и безопасность папки логов
- Дополнительные параметры логирования
- Проверка и отладка логов
- Источники
- Заключение
Почему логи не появляются в 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 это просто:
- Откройте Службы (services.msc).
- Найдите “postgresql-x64-16” (или вашу версию).
- Правой кнопкой → Перезапустить.
Или в 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 или вашего юзера) не может писать. Решение:
- Правой на папку → Свойства → Безопасность.
- Добавить “NETWORK SERVICE” или “SYSTEM” с Полным доступом.
- Или запустите службу от локального админа (не рекомендуется для продакшена).
Проверьте в 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'.
Проверка и отладка логов
Готово? Тестируем:
SHOW log_statement;— должно быть ‘all’.SHOW logging_collector;— on.- Выполните
SELECT pg_sleep(1);— ищите в CSV-файлах. 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.
Источники
- PostgreSQL Documentation: 16: 20.8. Error Reporting and Logging
- PostgreSQL Documentation: Current: 19.8. Error Reporting and Logging
- How to log PostgreSQL queries? - Stack Overflow
- PostgreSQL Logs: Logging Setup and Troubleshooting - Loggly
- Nothing is written to log in log_directory() for a PostgreSQL cluster - DBA Stack Exchange
- PostgreSQL Logs: How to Enable Logging - Sematext
Заключение
Включить postgresql логирование запросов в PostgreSQL 16.4 на Windows проще простого: log_statement = 'all', правильные пути с /, права на папку и рестарт службы. Избегайте pg_reload_conf() для коллектора — это ловушка №1. Для вашей БД хватит ALTER DATABASE, чтобы не тонуть в SELECT’ах. Теперь вы увидите каждый запрос — отладка полетит. Если трафик огромный, мониторьте размер логов и ротируйте. Удачи с дебагом!