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


373

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

Любые идеи?


15
Это важно:logging_collector = on
bonyiii

Кроме того, имейте в виду, что в некоторых дистрибутивах GNU / Linux (например, Debian Jessie) systemctl restart postgresqlможет фактически не перезапускаться настроенная вами служба PostgreSQL (пока я не понимаю, почему), поэтому изменения в файле конфигурации не будут применены. Это безопаснее использовать pg_ctl(или pg_ctlclusterна Debian).
Скиппи ле Гран Гуру

4
Я только проверил это в Ubuntu 16.04 LTS, с PostgreSQL 9.5, и systemctl reload postgresql, systemctl restart postgresql, service postgresql reloadи service postgresql restartвсе изменения конфигурации делает эффективной.
Бен Джонсон

Ответы:


466

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


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

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

  • убедитесь, что вы включили log_destinationпеременную
  • убедитесь, что вы включите logging_collector
  • также убедитесь, что log_directoryкаталог уже существует внутри dataкаталога и что пользователь postgres может писать в него.

3
Так что просто любопытно, означает ли это, что PostgreSQL не может включить ведение журнала, пока я не перезапущу сервер? В MySQL это так же просто, как "SET GLOBAL general_log = 'ON';"
Антоний

7
Я сам не знаю, есть ли способ сделать это с помощью оператора SQL, такого как MySQL, но вы можете отправить работающему серверу команду для перезагрузки конфигурацииpg_ctl reload
Jarret Hardie

9
PostgreSQL пока не имеет возможности изменять свои параметры с помощью операторов SQL (по состоянию на 9.2). Большинство параметров ведения журнала можно изменить без полной перезагрузки сервера, просто выполнив перезагрузку pg_ctl. Однако для изменения logging_collector требуется перезапуск.
Грег Смит

6
С Postgres 9.4 и новой ALTER SYSTEMкомандой суперпользователь может устанавливать параметры GUC из SQL.
Эрвин Брандштеттер

6
Указанный dataв ответе каталог не является его буквальным именем; он относится к пути, назначенному data_directoryпеременной в файле конфигурации PostgreSQL. В Debian и Ubuntu GNU / Linux этот файл обычно находится по адресу /etc/postgresql/$v/main/postgresql.conf, где $vнаходится версия сервера. Кроме того, в вышеупомянутых системах, когда log_destination = 'stderr'вывод записывается /var/log/postgresql/postgresql-$v-main.log, где $vнаходится версия сервера (а не в какое-то место внутри data_directory).
Бен Джонсон

104

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

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

  1. #log_directory = 'pg_log' в log_directory = 'pg_log'

  2. #log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' в log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'

  3. #log_statement = 'none' в log_statement = 'all'

  4. #logging_collector = off в logging_collector = on

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

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

  7. Пожарный запрос в postgresql select 2+2

  8. Найти текущий логин /var/lib/pgsql/9.2/data/pg_log/

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

Спасибо, Пол, @ Джаррет Харди, @ Золтан, @Rix Бек, @Latif Премани


2
На debian stretch мне также пришлось раскомментировать # log_destination = 'stderr'файл конфигурации, прежде чем это сработало.
phihag

Я внимательно следил за твоим шагом, и он не работает. Требуется ли перезагрузка?
Йоханес А.И.

2
если вы не хотите писать bash-скрипт, а просто хотите, чтобы журналы перезаписывались ежемесячно, сделайте это: log_filename = 'postgresql-%d.log'и нет, он не будет перезаписываться после каждого перезапуска, он будет добавляться для каждого дня и перезаписываться каждый месяц. Конечно, есть разные дни в зависимости от месяца 28,29,30,31 - но вы поняли идею.
sojim2

44
SELECT set_config('log_statement', 'all', true);

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


7
Это обычно чище, чтобы использовать SET log_statement = 'all'или (для уровня транзакции) SET LOCAL log_statement = 'all'. Вы также можете быть заинтересованы в client_min_messagesи log_min_messagesнастройке.
Крейг Рингер

1
Это здорово, так как я хочу регистрировать только сообщения моего соединения. К сожалению я получаю: permission denied to set parameter "log_statement"так как мой пользователь не является суперпользователем.
Геттли

3
Вы можете попросить администратора БД о предоставлении грантов для выполнения функции. GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON { FUNCTION function_name ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) [, ...] | ALL FUNCTIONS IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
Рикс Бек

35

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

log_directory = 'pg_log'                    
log_filename = 'postgresql-dateformat.log'
log_statement = 'all'
logging_collector = on

2
logging_collector = on необходим
wjin

Работает как шарм. Я был смущен комментарием к файлу конфигурации, сказав Required to be on for csvlogs, что эта опция заключается в том, чтобы регистрировать выходные данные запросов, а не только операторы, но это не так.
Якопофар

В файле data / postgresql.conf измените настройку log_statement на «все».
FlyingV

32

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

ALTER DATABASE your_database_name
SET log_statement = 'all';

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



20

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

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

10

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

  1. Установить (раскомментировать) log_statement = 'all'и log_min_error_statement = errorв /var/lib/pgsql/9.2/data/postgresql.conf.
  2. Перезагрузите конфигурацию PostgreSQL. Для меня это было сделано бегом /usr/pgsql-9.2/bin/pg_ctl reload -D /var/lib/pgsql/9.2/data/.
  3. Найти сегодняшний логин /var/lib/pgsql/9.2/data/pg_log/

4
Вам не нужно перезапускать - pg_ctl reloadдостаточно и не прерывает соединения. Не уверен, что этот ответ добавляет что-то к тем, кто уже здесь.
Крейг Рингер

1
@CraigRinger Спасибо за комментарий, это довольно важный факт. Я обновлю ответ, как только попробую ваше предложение. Я написал этот ответ в первую очередь для справки, потому что в то время у меня было очень мало опыта работы с UNIX, и я хотел, чтобы вся необходимая информация была в одном месте (например, местоположение postgresql.conf и файлы журналов).
Золтан

0

Вы также должны установить этот параметр для регистрации каждого оператора:

log_min_duration_statement = 0

0

Я пытался установить log_statementв некотором конфигурационном файле postgres, но на самом деле этот файл не был прочитан нашими postgres.

Я подтвердил, что с помощью запроса:

select *
from pg_settings

[...]
log_statement   none # That was not the value i was expected for !!!

Я использую этот способ https://stackoverflow.com/a/41912295/2294168

command: postgres -c config_file=/etc/postgresql.conf
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.