我有几个人直接在一些系统中执行数据库查询。
我希望将所有手动交互执行的查询记录到安全的syslog服务器上,如果这不行,那么记录所有使用psql
二进制客户端执行的查询。
我使用Debian Jessie、PostgreSQL 9.4和9.1。
我该如何实现这一点呢?
我有几个人直接在一些系统中执行数据库查询。
我希望将所有手动交互执行的查询记录到安全的syslog服务器上,如果这不行,那么记录所有使用psql
二进制客户端执行的查询。
我使用Debian Jessie、PostgreSQL 9.4和9.1。
我该如何实现这一点呢?
有多种方法可以设置配置变量,并具有不同的范围。关于这些方法,您可以参考官方文档。
由于log_statement
是超级用户才能设置的选项,因此您可以排除所有客户端选项,而服务器或数据库范围的设置对于您的情况来说可能太广泛了。
我认为你只有使用每个用户选项,即:
ALTER USER interactive_user SET log_statement = 'all';
ALTER SYSTEM SET log_statement = 'all';
ALTER USER application_user SET log_statement = 'none';
您还可以将这些指令添加到配置文件中,这些配置文件通常位于/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
以提供有关连接的更多细节(来自文档),格式如下:log_line_prefix = "string"
e.g.
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
ALTER USER ... SET log_statement = 'all'
为许多配置变量设置每个用户覆盖。 - Nick Barnes