Làm thế nào để đăng nhập truy vấn PostgreSQL?


373

Làm cách nào để cho phép ghi nhật ký tất cả SQL được thực thi bởi PostgreQuery 8.3?

Đã chỉnh sửa (thông tin thêm) Tôi đã thay đổi những dòng này:

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

Và khởi động lại dịch vụ PostgreSQL ... nhưng không có nhật ký nào được tạo ... Tôi đang sử dụng Windows Server 2003.

Có ý kiến ​​gì không?


15
Điều này rất quan trọng:logging_collector = on
bonyiii

Ngoài ra, hãy cẩn thận rằng trên một số bản phân phối GNU / Linux (ví dụ Debian Jessie) systemctl restart postgresqlcó thể không thực sự khởi động lại dịch vụ PostgreQuery mà bạn đã cấu hình (tôi không hiểu tại sao), vì vậy những thay đổi trong tệp cấu hình sẽ không được áp dụng. An toàn hơn khi sử dụng pg_ctl(hoặc pg_ctlclustertrên Debian).
Skippy le Grand Gourou

4
Tôi chỉ thử nghiệm điều này trong Ubuntu 16.04 LTS, với PostgreSQL 9.5, và systemctl reload postgresql, systemctl restart postgresql, service postgresql reloadservice postgresql restarttất cả làm thay đổi cấu hình hiệu quả.
Ben Johnson

Câu trả lời:


465

Trong data/postgresql.conftệp của bạn , thay đổi log_statementcài đặt thành 'all'.


Biên tập

Nhìn vào thông tin mới của bạn, tôi muốn nói có thể có một vài cài đặt khác để xác minh:

  • đảm bảo bạn đã bật log_destinationbiến
  • đảm bảo bạn bật logging_collector
  • cũng đảm bảo rằng log_directorythư mục đã tồn tại bên trong datathư mục và người dùng postgres có thể ghi vào thư mục đó.

3
Vì vậy, chỉ tò mò, điều đó có nghĩa là PostgreSQL không thể kích hoạt đăng nhập trừ khi tôi khởi động lại máy chủ? Trong MySQL, nó đơn giản như "SET GLOBAL general_log = 'ON';"
Antony

7
Bản thân tôi không biết có cách nào để sử dụng câu lệnh SQL như MySQL không, nhưng bạn có thể gửi lệnh cho máy chủ đang chạy để tải lại cấu hình vớipg_ctl reload
Jarret Hardie

9
PostgreQuery chưa có cách nào để thay đổi các tham số của nó thông qua các câu lệnh SQL (kể từ 9.2). Hầu hết các tham số ghi nhật ký có thể được thay đổi mà không cần khởi động lại máy chủ đầy đủ, chỉ bằng cách thực hiện tải lại pg_ctl. Tuy nhiên, phải mất một khởi động lại để thay đổi log_collector.
Greg Smith

6
Với Postgres 9.4 và ALTER SYSTEMlệnh mới, siêu người dùng có thể đặt tham số GUC từ SQL.
Erwin Brandstetter

6
Thư mục datađược trích dẫn trong câu trả lời không phải là tên theo nghĩa đen của nó; nó đề cập đến đường dẫn được gán cho data_directorybiến trong tệp cấu hình PostgreSQL. Trên Debian và Ubuntu GNU / Linux, tệp này thường nằm ở /etc/postgresql/$v/main/postgresql.confđâu, $vphiên bản máy chủ. Ngoài ra, trên các hệ thống đã nói ở trên, khi nào log_destination = 'stderr', đầu ra được ghi vào /var/log/postgresql/postgresql-$v-main.log, $vphiên bản máy chủ ở đâu (không phải một số vị trí bên trong data_directory).
Ben Johnson

104

Chỉnh sửa của bạn /etc/postgresql/9.3/main/postgresql.confvà thay đổi các dòng như sau.

Lưu ý : Nếu bạn không tìm thấy postgresql.conftệp, thì chỉ cần nhập $locate postgresql.confvào một thiết bị đầu cuối

  1. #log_directory = 'pg_log' đến log_directory = 'pg_log'

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

  3. #log_statement = 'none' đến log_statement = 'all'

  4. #logging_collector = off đến logging_collector = on

  5. Tùy chọn :SELECT set_config('log_statement', 'all', true);

  6. sudo /etc/init.d/postgresql restart hoặc là sudo service postgresql restart

  7. Truy vấn cháy trong postgresql select 2+2

  8. Tìm đăng nhập hiện tại /var/lib/pgsql/9.2/data/pg_log/

Các tệp nhật ký có xu hướng phát triển rất nhiều theo thời gian và có thể giết chết máy của bạn. Vì sự an toàn của bạn, hãy viết một tập lệnh bash sẽ xóa nhật ký và khởi động lại máy chủ postgresql.

Cảm ơn @paul, @Jarret Hardie, @ Zoltán, @Rix Beck, @Latif Premani


2
Khi kéo dài debian, tôi cũng phải bỏ ghi chú # log_destination = 'stderr'vào tập tin cấu hình trước khi nó hoạt động.
phihag

Tôi đã làm theo bước của bạn một cách cẩn thận và nó không hoạt động. Có cần khởi động lại không?
Yohanes AI

2
nếu bạn không muốn viết một tập lệnh bash mà chỉ muốn các bản ghi được ghi đè hàng tháng, hãy làm điều này: log_filename = 'postgresql-%d.log'và không nó sẽ không ghi đè sau mỗi lần khởi động lại, nó sẽ xuất hiện mỗi ngày và ghi đè lên mỗi tháng. Tất nhiên có những ngày khác nhau tùy thuộc vào tháng 28,29,30,31 - nhưng bạn có ý tưởng.
sojim2

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

Với quyền người dùng tương ứng có thể sử dụng truy vấn trên sau khi kết nối. Điều này sẽ ảnh hưởng đến việc đăng nhập cho đến khi phiên kết thúc.


7
Nó thường sạch hơn để sử dụng SET log_statement = 'all'hoặc (cho cấp độ giao dịch) SET LOCAL log_statement = 'all'. Bạn cũng có thể quan tâm đến client_min_messageslog_min_messagescài đặt.
Craig Ringer

1
Điều này thật tuyệt, vì tôi chỉ muốn đăng nhập các tin nhắn kết nối của mình. Thật không may, tôi nhận được: permission denied to set parameter "log_statement"vì người dùng của tôi không phải là siêu người dùng.
guettli

3
Bạn có thể yêu cầu quản trị viên DB cấp các hàm thực thi chức năng. 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 ]
Rix Beck

35

Bạn cũng cần thêm các dòng này trong PostgreSQL và khởi động lại máy chủ:

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

2
log_collector = on là cần thiết
wjin

Hoạt động như một lá bùa. Tôi đã bối rối bởi nhận xét về tập tin cấu hình Required to be on for csvlogs, nghĩ rằng tùy chọn này là để ghi nhật ký truy vấn và không chỉ các câu lệnh, nhưng đó không phải là trường hợp.
Jacopofar

Trong tệp data / postgresql.conf của bạn, hãy thay đổi cài đặt log_statement thành 'all'.
FlyingV

32

FYI: Các giải pháp khác sẽ chỉ ghi nhật ký các câu lệnh từ cơ sở dữ liệu mặc định postgres. bắt đầu với giải pháp của họ; sau đó:

ALTER DATABASE your_database_name
SET log_statement = 'all';

Tham chiếu: https://serverfault.com/a/376888 /log_statement



20

+1 cho câu trả lời trên. Tôi sử dụng cấu hình sau đây

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

10

Chỉ để có thêm thông tin chi tiết cho CentOS 6.4 (Red Hat 4.4.7-3) đang chạy PostgreQuery 9.2, dựa trên các hướng dẫn được tìm thấy trên trang web này :

  1. Đặt (không chú ý) log_statement = 'all'log_min_error_statement = errortrong /var/lib/pgsql/9.2/data/postgresql.conf.
  2. Tải lại cấu hình PostgreSQL. Đối với tôi, điều này đã được thực hiện bằng cách chạy /usr/pgsql-9.2/bin/pg_ctl reload -D /var/lib/pgsql/9.2/data/.
  3. Tìm đăng nhập ngày hôm nay /var/lib/pgsql/9.2/data/pg_log/

4
Bạn không cần phải khởi động lại - một pg_ctl reloadlà đủ và không làm gián đoạn kết nối. Không thuyết phục câu trả lời này thêm bất cứ điều gì cho những người đã ở đây.
Craig Ringer

1
@CraigRinger Cảm ơn bạn đã bình luận, đó là một thực tế khá quan trọng. Tôi sẽ cập nhật câu trả lời khi tôi đã thử đề xuất của bạn. Tôi đã viết câu trả lời này chủ yếu để tham khảo cho bản thân mình, vì tại thời điểm đó tôi có rất ít kinh nghiệm với UNIX và tôi muốn có tất cả thông tin cần thiết ở một nơi (ví dụ: vị trí của postgresql.conf và các tệp nhật ký).
Zoltán

0

Bạn cũng nên đặt tham số này để ghi lại mọi câu lệnh:

log_min_duration_statement = 0

0

Tôi đã cố gắng thiết lập log_statementtrong một số tập tin cấu hình postgres nhưng thực tế tập tin không được đọc bởi các postgres của chúng tôi.

Tôi xác nhận rằng sử dụng yêu cầu:

select *
from pg_settings

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

Tôi sử dụng cách này https://stackoverflow.com/a/41912295/2294168

command: postgres -c config_file=/etc/postgresql.conf
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.