Как включить логирование всех запросов в 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 не может создать файл из-за ограничений антивируса или прав доступа.

    Часто задаваемые вопросы