我有幾個人直接進行一些數據庫查詢進入某些系統。記錄PostgreSQL交互式查詢
我想登錄到一個安全的系統日誌服務器所有的查詢完成交互/手動,或失敗,所有查詢使用psql
二進制客戶端完成。
我使用的是Debian Jessie,PostgreSQL 9.4和9.1。
我怎麼能做到這一點?
我有幾個人直接進行一些數據庫查詢進入某些系統。記錄PostgreSQL交互式查詢
我想登錄到一個安全的系統日誌服務器所有的查詢完成交互/手動,或失敗,所有查詢使用psql
二進制客戶端完成。
我使用的是Debian Jessie,PostgreSQL 9.4和9.1。
我怎麼能做到這一點?
有a multitude of methods用於設置配置變量,具有不同的範圍。
由於log_statement
是一個超級用戶設置,您可以排除所有客戶端選項,並且服務器或數據庫範圍的設置對於您的情況可能過於寬泛。
我相信這只是給你留下的每用戶選項,即:
ALTER USER interactive_user SET log_statement = 'all';
或者,如果它使事情更易於管理:
ALTER SYSTEM SET log_statement = 'all';
ALTER USER application_user SET log_statement = 'none';
注意,這些設置只適用於連接,所以它們不能通過SET ROLE
命令觸發(或繞過)。
當然,這一切都假定您的應用程序和您的交互式用戶不共享登錄名,但我認爲沒有其他任何內容具有適當的粒度級別。
您也可以將這些指令添加到通常位於/etc/postgresql/{version}/main/postgresql.conf
或/etc/postgresql/{version}/main/conf.d/my-overrides.conf
的配置文件,例如,
log_connections = true
log_disconnections = true
log_statement = all
log_duration = true
還可以添加log_line_prefix
提供關於在形式的連接(from the documentation)更詳細地:
log_line_prefix = "string"
例如
log_line_prefix = '%m [%p-%l] [%c] %u %d %a '
其中(出於完整性)從文檔的printf
選項有:
%a Application name
%u User name
%d Database name
%r Remote host name or IP address, and remote port
%h Remote host name or IP address
%p Process ID
%t Time stamp without milliseconds
%m Time stamp with milliseconds
%n Time stamp with milliseconds (as a Unix epoch)
%i Command tag: type of session's current command
%e SQLSTATE error code
%c Session ID: see below
%l Number of the log line for each session or process, starting at 1
%s Process start time stamp
%v Virtual transaction ID (backendID/localXID)
%x Transaction ID (0 if none is assigned)
%q Produces no output, but tells non-session processes to stop at this point in the string; ignored by session processes
http://stackoverflow.com/questions/722221/how-to-log-postgresql-queries –
@LandonKuhn謝謝。我知道日誌指令,但是我只打算記錄手工/操作員完成的命令,而不是程序/軟件完成的命令。意圖是相同的我的另一個問題http://stackoverflow.com/questions/37834849/logging-mysql-interactive-queries –
應用程序和交互式會話作爲不同的用戶連接嗎?您可以設置每個用戶覆蓋許多配置變量,例如'ALTER USER ... SET log_statement ='all''。 –