Вы можете регистрировать любые сообщения (ошибки, предупреждения и т. Д.) С множеством дополнительной информации в файле журнала базы данных .Это стандартное поведение.Конечно, ваш кластер базы данных должен быть настроен для этого. Прочтите подробное руководство здесь .
В зависимости от клиента вы также сможете получать сообщений об ошибках в качестве прямого ответа от сервера базы данных.Обратите внимание, что ошибки сообщаются в другом потоке, чем вывод данных.Как stout
и stderr
в оболочке.
Из оболочки вы, вероятно, вызовете psql -f
для выполнения скрипта.Посмотрите, что происходит в этой демонстрации:
Создайте в оболочке фиктивный сценарий SQL:
vim test.sql
Добавьте в него что-то вроде этого:
CREATE temp table x (a int primary key, b int);
insert into x values (1,2),(3,4);
COPY x TO '/var/lib/postgres/dev/test.out';
COPY x FROM '/var/lib/postgres/dev/test.out';
Выполните его:
psql mydb -f test.sql
Вывод зависит от различных настроек, таких как client_min_messages
:
psql:test.sql:2: NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "x_pkey" for table "x"
CREATE TABLE
INSERT 0 2
psql:test.sql:4: ERROR: duplicate key value violates unique constraint "x_pkey"
KONTEXT: COPY x, line 1: "1 2"
Поскольку я настроил log_statement = all
(среди прочих), мой журнал сервера читает:
2011-11-15 22:36:23 CET postgres LOG: statement: CREATE temp table x (a int primary key, b int);
2011-11-15 22:36:23 CET postgres LOG: statement: insert into x values (1,2),(3,4);
2011-11-15 22:36:23 CET postgres LOG: statement: COPY x FROM '/var/lib/postgres/dev/test.out';
2011-11-15 22:36:23 CET postgres ERROR: duplicate key value violates unique constraint "x_pkey"
2011-11-15 22:36:23 CET postgres CONTEXT: COPY x, line 1: "1 2"
2011-11-15 22:36:23 CET postgres STATEMENT: COPY x FROM '/var/lib/postgres/dev/test.out';
Я бы не использовал log_statement = all
на производительном сервере.Это создает огромных файлов журналов.