2009-04-06 5 views
281

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

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

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

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

Любые идеи?

+8

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

+0

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

+3

Я только что протестировал это в Ubuntu 16.04 LTS, с PostgreSQL 9.5 и 'systemctl reload postgresql',' systemctl restart postgresql', 'service postgresql reload' и' service postgresql restart ', все изменения конфигурации рендеринга эффективны. –

ответ

368

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


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

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

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

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

+7

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

+7

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

18

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

log_line_prefix = '%t %c %u ' # time sessionid user 
log_statement = 'all' 
31
SELECT set_config('log_statement', 'all', true); 

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

+5

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

+1

Это замечательно, так как я хочу регистрировать только сообщения моего соединения. К сожалению, я получаю: 'разрешение отклонено для установки параметра« log_statement »', поскольку мой пользователь не является суперпользователем. – guettli

+3

Вы можете попросить администратора БД предоставить гранты, выполняющие эту функцию. 'GRANT {EXECUTE | ALL [PRIVILEGES]} ON {FUNCTION function_name ([[argmode] [arg_name] arg_type [, ...]]) [, ...] | ВСЕ ФУНКЦИИ В SCHEMA schema_name [, ...]} TO {[GROUP] role_name | PUBLIC} [, ...] [WITH GRANT OPTION] ' –

8

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

  1. Set (раскомментируйте) 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' и не прерывать соединения. Не уверен, что этот ответ добавляет что-либо к тем, что уже здесь. –

+1

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

+1

@CraigRinger протестирован и обновлен в ответ. Благодаря! –

22

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

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

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

+0

Это самый полный и прямой ответ. – Florent

+0

Работает как шарм. Я был смущен комментарием в файле конфигурации, в котором говорилось: «Обязательно быть включенным для csvlogs», считая, что эта опция предназначена для вывода запросов журнала, а не только для операторов, но это не так. – Jacopofar

44

Корректировать /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.

Благодаря @paul, @Jarret Гарди, @ Золтан, @Rix Бек, @Latif Premani

7

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

ALTER DATABASE your_database_name 
SET log_statement = 'all'; 

Ref: https://serverfault.com/a/376888/log_statement