2016-06-15 56 views
2

我有幾個人直接進行一些數據庫查詢進入某些系統。記錄PostgreSQL交互式查詢

我想登錄到一個安全的系統日誌服務器所有的查詢完成交互/手動,或失敗,所有查詢使用psql二進制客戶端完成。

我使用的是Debian Jessie,PostgreSQL 9.4和9.1。

我怎麼能做到這一點?

+0

http://stackoverflow.com/questions/722221/how-to-log-postgresql-queries –

+0

@LandonKuhn謝謝。我知道日誌指令,但是我只打算記錄手工/操作員完成的命令,而不是程序/軟件完成的命令。意圖是相同的我的另一個問題http://stackoverflow.com/questions/37834849/logging-mysql-interactive-queries –

+2

應用程序和交互式會話作爲不同的用戶連接嗎?您可以設置每個用戶覆蓋許多配置變量,例如'ALTER USER ... SET log_statement ='all''。 –

回答

2

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命令觸發(或繞過)。

當然,這一切都假定您的應用程序和您的交互式用戶不共享登錄名,但我認爲沒有其他任何內容具有適當的粒度級別。

1

您也可以將這些指令添加到通常位於/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