Як увійти в систему PostgreSQL-запити?


372

Як увімкнути ведення журналу всіх 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).
Skippy le Grand Gourou

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

Відповіді:


464

У своєму 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-сервер.

Дякую @paul, @Jarret Hardie, @ Zoltán, @Rix Beck, @Latif Premani


2
На розтягуванні debian я також повинен був скаментувати # log_destination = 'stderr'файл конфігурації, перш ніж це працювало.
фігаг

Я уважно стежу за вашим кроком, і це не працює. Чи потрібен перезапуск?
Йохан AI

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"оскільки мій користувач не є надпопулярним.
guettli

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 на 'all'.
FlyingV

32

FYI: Інші рішення будуть реєструвати лише заяви з бази даних за замовчуванням, як правило, 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
Вам не потрібно перезавантажувати - a 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.