Как регистрировать запросы PostgreSQL?

319

Как включить ведение журнала всего SQL, выполняемого PostgreSQL 8.3?

Отредактировано (подробнее) Я изменил эти строки:

log_directory = 'pg_log'                    
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_statement = 'all'

И перезапустите службу PostgreSQL... но журнал не был создан... Я использую Windows Server 2003.

Любые идеи?

  • 14
    Это важно: logging_collector = on
  • 0
    Также имейте в systemctl restart postgresql , что в некоторых дистрибутивах GNU / Linux (например, Debian Jessie) systemctl restart postgresql может фактически не перезапускать настроенную вами службу PostgreSQL (пока не понимаю, почему), поэтому изменения в файле конфигурации не будут применены. Безопаснее использовать pg_ctl (или pg_ctlcluster в Debian).
Показать ещё 1 комментарий
Теги:
logging

9 ответов

426
Лучший ответ

В файле data/postgresql.conf измените настройку log_statement на 'all'.


редактировать

Глядя на вашу новую информацию, я бы сказал, что может быть несколько других настроек для проверки:

  • убедитесь, что вы log_destination переменную log_destination
  • убедитесь, что вы logging_collector
  • также убедитесь, что каталог log_directory уже существует внутри каталога data и что пользователь postgres может писать в него.
  • 3
    Так что просто любопытно, означает ли это, что PostgreSQL не может включить ведение журнала, пока я не перезапущу сервер? В MySQL это так же просто, как "SET GLOBAL general_log = 'ON';"
  • 7
    Я сам не знаю, есть ли способ сделать это с помощью оператора SQL, такого как MySQL, но вы можете отправить работающему серверу команду для перезагрузки конфигурации с помощью pg_ctl reload
Показать ещё 6 комментариев
73

Отредактируйте /etc/postgresql/9.3/main/postgresql.conf и измените строки следующим образом.

Примечание. Если вы не нашли файл postgresql.conf, просто введите $locate postgresql.conf в терминал

  • #log_directory = 'pg_log' to log_directory = 'pg_log'

  • #log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' to log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'

  • #log_statement = 'none' to log_statement = 'all'

  • #logging_collector = off to logging_collector = on

  • Необязательный: SELECT set_config('log_statement', 'all', true);

  • sudo /etc/init.d/postgresql restart или sudo service postgresql restart

  • Запрос на пожар в postgresql select 2+2

  • Найти текущий журнал /var/lib/pgsql/9.2/data/pg_log/

Файлы журналов, как правило, растут много времени и могут убить вашу машину. Для вашей безопасности напишите bash script, который удалит журналы и перезапустит сервер postgresql.

Спасибо @paul, @Jarret Hardie, @Zoltán, @Rix Beck, @Latif Premani

  • 2
    На debian stretch мне также пришлось раскомментировать # log_destination = 'stderr' в файле конфигурации, прежде чем это сработало.
  • 0
    Я внимательно следил за твоим шагом, и он не работает. Требуется ли перезагрузка?
Показать ещё 2 комментария
35
SELECT set_config('log_statement', 'all', true);

С соответствующим правом пользователя можно использовать указанный выше запрос после подключения. Это повлияет на регистрацию до окончания сеанса.

  • 6
    Обычно SET log_statement = 'all' использовать SET log_statement = 'all' или (для уровня транзакции) SET LOCAL log_statement = 'all' . Вы также можете быть заинтересованы в настройках client_min_messages и log_min_messages .
  • 1
    Это здорово, так как я хочу регистрировать только сообщения моего соединения. К сожалению, я получаю: permission denied to set parameter "log_statement" так как мой пользователь не является суперпользователем.
Показать ещё 1 комментарий
30

Вам также необходимо добавить эти строки в PostgreSQL и перезапустить сервер:

log_directory = 'pg_log'                    
log_filename = 'postgresql-dateformat.log'
log_statement = 'all'
logging_collector = on
  • 2
    logging_collector = on необходимо
  • 0
    Это самый полный и прямой ответ.
Показать ещё 1 комментарий
23
19

+1 выше ответов. Я использую следующую конфигурацию

log_line_prefix = '%t %c %u ' # time sessionid user
log_statement = 'all'
17

FYI: другие решения будут только регистрировать операторы из базы данных по умолчанию, обычно postgres - для записи других; начните с их решения; то:

ALTER DATABASE your_database_name
SET log_statement = 'all';

Ссылка: https://serverfault.com/a/376888/log_statement

9

Просто для получения более подробной информации о CentOS 6.4 (Red Hat 4.4.7-3), на которой запущена PostgreSQL 9.2, на основе найденных инструкций на этой веб-странице:

  • Установить (раскомментировать) log_statement = 'all' и log_min_error_statement = error в /var/lib/pgsql/9.2/data/postgresql.conf.
  • Перезагрузите конфигурацию PostgreSQL. Для меня это было сделано, запустив /usr/pgsql-9.2/bin/pg_ctl reload -D /var/lib/pgsql/9.2/data/.
  • Найдите сегодня журнал /var/lib/pgsql/9.2/data/pg_log/
  • 4
    Вам не нужно перезапускать - pg_ctl reload достаточна и не прерывает соединения. Не уверен, что этот ответ добавляет что-то к тем, кто уже здесь.
  • 1
    @CraigRinger Спасибо за комментарий, это довольно важный факт. Я обновлю ответ, как только попробую ваше предложение. Я написал этот ответ в первую очередь для справки, потому что в то время у меня было очень мало опыта работы с UNIX, и я хотел, чтобы вся необходимая информация была в одном месте (например, местоположение postgresql.conf и файлы журналов).
Показать ещё 1 комментарий
0

Мне нужно увидеть эти журналы postgres в таблице pg_stats_activity. Возможно ли это? Пожалуйста, помогите.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню