ChatGPT解决这个技术问题 Extra ChatGPT

如何记录 PostgreSQL 查询?

如何启用 PostgreSQL 8.3 执行的所有 SQL 的日志记录?

编辑(更多信息)我改变了这些行:

log_directory = 'pg_log'                    
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_statement = 'all'

并重新启动 PostgreSQL 服务...但没有创建日志...我使用的是 Windows Server 2003。

有任何想法吗?

这很重要:logging_collector = on
另外,请注意,在某些 GNU/Linux 发行版(例如 Debian Jessie)上,systemctl restart postgresql 可能实际上不会重新启动您已配置的 PostgreSQL 服务(我还不明白为什么),因此不会应用配置文件中的更改。使用 pg_ctl(或 Debian 上的 pg_ctlcluster)更安全。
我刚刚在 Ubuntu 16.04 LTS 中测试了这个,使用 PostgreSQL 9.5,并且 systemctl reload postgresqlsystemctl restart postgresqlservice postgresql reloadservice postgresql restart 所有渲染配置更改都有效。
在我的情况下(Win 10 桌面,pg12),我必须使用 ALTER DATABASE(如 this answer)显式启用实际数据库的日志记录

a
automatix

在您的 data/postgresql.conf 文件中,将 log_statement 设置更改为 'all'

编辑

查看您的新信息,我想说可能还有其他一些设置需要验证:

确保您已打开 log_destination 变量

确保打开 logging_collector

还要确保 log_directory 目录已经存在于数据目录中,并且 postgres 用户可以写入它。


所以只是好奇,这是否意味着除非我重新启动服务器,否则 PostgreSQL 无法启用日志记录?在 MySQL 中,就像“SET GLOBAL general_log = 'ON';”一样简单
我自己不知道是否有办法使用像 MySQL 这样的 SQL 语句来做到这一点,但是您可以向正在运行的服务器发送命令以使用 pg_ctl reload 重新加载配置
PostgreSQL 还没有办法通过 SQL 语句更改其参数(从 9.2 开始)。大多数日志记录参数可以在不完全重启服务器的情况下更改,只需执行 pg_ctl reload 即可。但是,需要重新启动才能更改 logging_collector。
使用 Postgres 9.4 和新的 ALTER SYSTEM 命令,超级用户可以从 SQL 设置 GUC 参数。
答案中引用的 data 目录不是它的字面名称;它指的是分配给 PostgreSQL 配置文件中 data_directory 变量的路径。在 Debian 和 Ubuntu GNU/Linux 上,此文件通常位于 /etc/postgresql/$v/main/postgresql.conf,其中 $v 是服务器版本。此外,在上述系统上,当 log_destination = 'stderr' 时,输出被写入 /var/log/postgresql/postgresql-$v-main.log,其中 $v 是服务器版本(而不是 data_directory 内的某个位置)。
i
itachi

编辑您的 /etc/postgresql/9.3/main/postgresql.conf,并按如下方式更改行。

注意:如果您没有找到 postgresql.conf 文件,则只需在终端中输入 $locate postgresql.conf

#log_directory = 'pg_log' 到 log_directory = 'pg_log' #log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' 到 log_filename = 'postgresql-%Y-%m-%d_% H%M%S.log' #log_statement = 'none' to log_statement = 'all' #logging_collector = off to logging_collector = on 可选:SELECT set_config('log_statement', 'all', true); sudo /etc/init.d/postgresql restart 或 sudo service postgresql restart 在 postgresql 中触发查询 select 2+2 Find current log in /var/lib/pgsql/9.2/data/pg_log/

随着时间的推移,日志文件往往会增长很多,并且可能会杀死您的机器。为了您的安全,请编写一个 bash 脚本来删除日志并重新启动 postgresql 服务器。

谢谢@paul,@Jarret Hardie,@Zoltán,@Rix Beck,@Latif Premani


在 debian 拉伸上,我还必须在配置文件中取消注释 # log_destination = 'stderr' 才能工作。
我已仔细按照您的步骤进行操作,但它不起作用。需要重启吗?
如果您不想编写 bash 脚本,但只想每月覆盖日志,请执行以下操作:log_filename = 'postgresql-%d.log' 并且不会在每次重新启动后覆盖,它将每天追加并覆盖每个月。当然,根据 28、29、30、31 月份的不同,会有不同的日子——但你明白了。
我发现您可以从 Postgres 9.0 开始运行 select pg_reload_config();,而不是在步骤 6 中重新启动服务。
A
A T

仅供参考:其他解决方案只会记录默认数据库中的语句(通常是 postgres)来记录其他语句;从他们的解决方案开始;然后:

ALTER DATABASE your_database_name
SET log_statement = 'all';

参考:https://serverfault.com/a/376888 / log_statement


这应该是公认的答案——唯一具有实用价值的答案!
引用的语句在 Postgres 9.4 或更高版本中有效,但开头的段落是错误的。为相应的数据库集群在 postgresql.conf 中设置 log_statement = all - 正如公认的答案所暗示的那样 - 会影响该集群的 所有 数据库 - 这可以被每个数据库的设置所推翻。
重新连接 psql 以生效。
R
Rix Beck
SELECT set_config('log_statement', 'all', true);

有相应的用户权限可以在连接后使用上面的查询。这将影响日志记录,直到会话结束。


使用 SET log_statement = 'all' 或(对于事务级别)SET LOCAL log_statement = 'all' 通常更简洁。您可能还对 client_min_messageslog_min_messages 设置感兴趣。
这很棒,因为我只想记录我的连接消息。不幸的是,我得到:permission denied to set parameter "log_statement",因为我的用户不是超级用户。
您可以要求数据库管理员授予执行该功能的权限。 GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON { FUNCTION function_name ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) [, ...] | ALL FUNCTIONS IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
J
Jason Higgins

您还需要在 PostgreSQL 中添加这些行并重新启动服务器:

log_directory = 'pg_log'                    
log_filename = 'postgresql-dateformat.log'
log_statement = 'all'
logging_collector = on

logging_collector=on 是必要的
奇迹般有效。我对配置文件上的 Required to be on for csvlogs 注释感到困惑,认为此选项是记录查询输出而不仅仅是语句,但事实并非如此。
在您的 data/postgresql.conf 文件中,将 log_statement 设置更改为“全部”。
C
Chad Birch

log_statement 设置为 all

Error Reporting and Logging - log_statement


S
Shekhar

+1 以上答案。我使用以下配置

log_line_prefix = '%t %c %u ' # time sessionid user
log_statement = 'all'

Z
Zoltán

根据 on this web page 中的说明,了解运行 PostgreSQL 9.2 的 CentOS 6.4(Red Hat 4.4.7-3)的更多详细信息:

在 /var/lib/pgsql/9.2/data/postgresql.conf 中设置(取消注释)log_statement = 'all' 和 log_min_error_statement = 错误。重新加载 PostgreSQL 配置。对我来说,这是通过运行 /usr/pgsql-9.2/bin/pg_ctl reload -D /var/lib/pgsql/9.2/data/ 来完成的。在 /var/lib/pgsql/9.2/data/pg_log/ 中找到今天的日志


您无需重新启动 - pg_ctl reload 就足够了,并且不会中断连接。不相信这个答案会给已经在这里的人增加任何东西。
@CraigRinger 感谢您的评论,这是一个非常重要的事实。尝试过您的建议后,我将更新答案。我写这个答案主要是为了给自己参考,因为当时我对 UNIX 的经验很少,我想把所有必要的信息放在一个地方(例如 postgresql.conf 和日志文件的位置)。
D
Delirante

postgresql 中有一个扩展名。它的名字是“pg_stat_statements”。 https://www.postgresql.org/docs/9.4/pgstatstatements.html

基本上你必须稍微改变一下 postgresql.conf 文件:

shared_preload_libraries= 'pg_stat_statements'
pg_stat_statements.track = 'all'

然后您必须登录数据库并运行以下命令:

create extension pg_stat_statements;

它将创建名为“pg_stat_statements”的新视图。在此视图中,您可以看到所有已执行的查询。


H
H.Ç.T

您还应该设置此参数以记录每条语句:

log_min_duration_statement = 0

S
Ser

我试图在一些 postgres 配置文件中设置 log_statement,但实际上我们的 postgres 没有读取该文件。

我确认使用请求:

select *
from pg_settings

[...]
log_statement   none # That was not the value i was expected for !!!

我用这种方式https://stackoverflow.com/a/41912295/2294168

command: postgres -c config_file=/etc/postgresql.conf

S
Suresh

动态地,我们可以通过 2 种方式启用/禁用日志记录

更改数据库中的全局变量并重新加载配置 a) 设置 log_statement = 'all';或设置 log_min_duration_statement = 0; b) 选择 pg_reload_conf();从 Linux 命令行,编辑 postgres 配置文件,更改日志相关参数 log_min_duration_statement = 0 log_statement = 'all' 重新加载配置文件 su - postgres /usr/bin/pg_ctl reload

在这两种情况下,我们都不应该重新启动 Postgres。我们可以通过重新加载配置动态启用/禁用日志记录。

我希望这应该会有所帮助。