Как включить логирование всех запросов в PostgreSQL 16.4 на Windows
Вы настроили PostgreSQL 16.4 на Windows, указали log_destination = 'csvlog', включили logging_collector = on, задали папку для логов и даже установили log_min_messages = DEBUG5, но логи не появляются. Это распространённая ситуация, когда администраторы баз данных упускают один ключевой параметр. В этой статье мы разберём, почему логи пустуют и как правильно зафиксировать все запросы к определённой базе данных.
Почему логи PostgreSQL пусты после настройки?
Основная причина - параметр log_statement. По умолчанию он выключен (none). Даже при log_min_messages = DEBUG5 PostgreSQL не будет записывать обычные SQL-запросы (SELECT, INSERT, UPDATE, DELETE) в лог, пока явно не указать, какие именно операторы нужно логировать. DEBUG5 влияет только на сообщения отладки, но не на пользовательские запросы.
Ключевые параметры для логирования всех запросов
Чтобы увидеть все запросы к базе, необходимо изменить следующие настройки в файле postgresql.conf:
log_statement = 'all'- включает запись всех SQL-команд (DDL, DML, запросы).log_min_duration_statement = 0- записывает каждый запрос с его длительностью (0 означает все).log_line_prefix = '%t %d %u '- добавляет время, имя базы данных и пользователя для удобства фильтрации.
После изменения этих параметров обязательно выполните SELECT pg_reload_conf(); или перезапустите службу PostgreSQL. Логи начнут заполняться в указанной папке.
Как настроить логирование только для одной базы?
Если вам нужно видеть запросы только к конкретной базе (например, mydb), используйте параметр log_statement_stats в сочетании с фильтрацией на уровне базы. Однако проще всего задать log_statement = 'all' глобально, а затем анализировать логи по имени базы с помощью утилит вроде grep или findstr на Windows. Альтернатива - настроить расширение pg_stat_statements, которое собирает статистику запросов по каждой базе без записи в файловый лог.
Использование pg_stat_statements для мониторинга
Расширение pg_stat_statements позволяет увидеть все выполненные запросы, их частоту и среднее время выполнения. Для этого:
- Добавьте
shared_preload_libraries = 'pg_stat_statements'в postgresql.conf и перезапустите сервер. - Создайте расширение в нужной базе:
CREATE EXTENSION pg_stat_statements; - Запросите данные:
SELECT query, calls, total_time FROM pg_stat_statements ORDER BY total_time DESC;
Этот метод не заполняет файловые логи, но даёт полную картину по запросам в реальном времени.
Частые ошибки при настройке логов PostgreSQL
Вот что чаще всего упускают администраторы:
- Не указан log_statement - без него логируются только ошибки и предупреждения.
- Неправильный путь к папке логов - убедитесь, что папка существует и у пользователя PostgreSQL есть права на запись.
- Не перезагружена конфигурация - после
pg_reload_conf()проверьте, что новые параметры применились (выполнитеSHOW log_statement;). - Слишком высокий уровень log_min_messages - DEBUG5 избыточен для пользовательских запросов, используйте
log_min_messages = 'notice'.
Если после всех настроек логи всё ещё пусты, проверьте журнал событий Windows - возможно, PostgreSQL не может создать файл из-за ограничений антивируса или прав доступа.