记录 PostgreSQL 交互式查询

4

我有几个人直接在一些系统中执行数据库查询。

我希望将所有手动交互执行的查询记录到安全的syslog服务器上,如果这不行,那么记录所有使用psql二进制客户端执行的查询。

我使用Debian Jessie、PostgreSQL 9.4和9.1。

我该如何实现这一点呢?


https://dev59.com/tXRB5IYBdhLWcg3wF0DH - Landon Kuhn
@LandonKuhn 谢谢。我知道日志记录指令,但是我只想记录手动/由操作员执行的命令,而不是程序/软件执行的命令。意图与我的另一个问题相同http://stackoverflow.com/questions/37834849/logging-mysql-interactive-queries - Rui F Ribeiro
2
应用程序和交互会话是否作为不同的用户连接?您可以使用例如 ALTER USER ... SET log_statement = 'all' 为许多配置变量设置每个用户覆盖。 - Nick Barnes
@NickBarnes 我建议你把那个作为答案。虽然这不是我的本意,但它可能适合我的需求。 - Rui F Ribeiro
2个回答

5

有多种方法可以设置配置变量,并具有不同的范围。关于这些方法,您可以参考官方文档

由于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以提供有关连接的更多细节(来自文档),格式如下:
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接