2009-04-06 78 views
281

Làm cách nào để bật ghi nhật ký tất cả SQL được thực thi bởi PostgreSQL 8.3?Cách đăng nhập truy vấn PostgreSQL?

Edited (thêm thông tin) 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 đăng nhập được tạo ra ... Tôi đang sử dụng Windows Server 2003.

Bất kỳ ý tưởng nào?

+8

này rất quan trọng: '' 'logging_collector = on''' – bonyiii

+0

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

+3

Tôi vừa 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 reload' và' service postgresql restart' tất cả các thay đổi cấu hình render hiệu quả. –

Trả lời

368

Trong file data/postgresql.conf của bạn, thay đổi các thiết lập log_statement-'all'.


Sửa

Nhìn vào những thông tin mới của bạn, tôi muốn nói có thể có một vài thiết lập khác để xác minh:

  • chắc chắn rằng bạn đã bật log_destination biến
  • đảm bảo bạn bật logging_collector
  • cũng đảm bảo rằngThư mụcđã tồn tại bên trong thư mục data 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ể cho phép đă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 nếu có cách nào để làm điều đó bằng cách sử dụng câu lệnh SQL như MySQL, nhưng bạn có thể gửi một máy chủ đang chạy để tải lại cấu hình với 'pg_ctl reload' –

+7

PostgreSQL không có cách nào để thay đổi các tham số thông qua các câu lệnh SQL (như của 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 khởi động lại để thay đổi logging_collector. –

18

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

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

Với một người sử dụng tương ứng đúng có thể sử dụng các 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.

+5

Nó thường sạch hơn để sử dụng 'SET log_statement = 'all'' hoặc (đối với cấp độ giao dịch)' SET LOCAL log_statement =' all''. Bạn cũng có thể quan tâm đến các cài đặt 'client_min_messages' và' log_min_messages'. –

+1

Điều này thật tuyệt, vì tôi chỉ muốn ghi lại thông điệp kết nối của mình. Thật không may tôi nhận được: 'cho phép từ chối để thiết lập tham số" log_statement "' kể từ khi người dùng của tôi không phải là superuser. – guettli

+3

Bạn có thể yêu cầu quản trị viên cấp tài khoản DB thực hiện chức năng. 'GRANT {EXECUTE | ALL [PRIVILEGES]} TRÊN {FUNCTION function_name ([[argmode] [arg_name] arg_type [, ...]]) [, ...] | TẤT CẢ CÁC CHỨC NĂNG TRONG SCHEMA schema_name [, ...]} ĐẾN {[GROUP] role_name | PUBLIC} [, ...] [VỚI LỰA CHỌN LỰA CHỌN] ' –

8

Chỉ cần để có thêm chi tiết cho CentOS 6.4 (Red Hat 4.4.7-3) chạy PostgreSQL 9.2, dựa trên hướng dẫn tìm thấy on this web page:

  1. Set (bỏ ghi chú) log_statement = 'all'log_min_error_statement = error trong /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 log hiện nay trong /var/lib/pgsql/9.2/data/pg_log/
+4

Bạn không cần phải * khởi động lại * - quá trình tải lại' pg_ctl' là đủ 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. –

+1

@CraigRinger Cảm ơn nhận xét, đó thực sự là một thực tế 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ì lúc đó 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à tệp nhật ký). –

+1

@CraigRinger đã kiểm tra và cập nhật trong câu trả lời. Cảm ơn! –

22

Bạn cũng cần thêm những 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

logging_collector = on là cần thiết – wjin

+0

Đây là câu trả lời hoàn chỉnh nhất và thẳng thắn nhất. – Florent

+0

Hoạt động như một sự quyến rũ. Tôi đã nhầm lẫn bởi các bình luận trên tập tin cấu hình nói rằng 'Bắt buộc phải được trên cho csvlogs', suy nghĩ tùy chọn này là để đăng nhập đầu ra truy vấn và không chỉ báo cáo, nhưng nó không phải là trường hợp. – Jacopofar

44

Sửa /etc/postgresql/9.3/main/postgresql.conf của bạn, và thay đổi các dòng như sau.

Note: Nếu bạn không tìm thấy tập tin postgresql.conf, sau đó chỉ cần gõ $locate postgresql.conf trong một thiết bị đầu cuối

  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. Tùy chọn: SELECT set_config('log_statement', 'all', true);

  6. sudo /etc/init.d/postgresql restarthaysudo service postgresql restart

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

  8. Tìm log 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 trong một thời gian, và có thể giết chết máy tính 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

7

FYI: Các giải pháp khác sẽ chỉ đăng báo cáo từ các cơ sở dữ liệu mặc định-thường postgres -để đăng nhập khác; bắt đầu với giải pháp của họ; sau đó:

ALTER DATABASE your_database_name 
SET log_statement = 'all'; 

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

Các vấn đề liên quan