如何记录PostgreSQL查询?


371

如何启用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。

有任何想法吗?


15
这很重要:logging_collector = on
bonyiii

另外,请注意,在某些GNU / Linux发行版(例如Debian Jessie)上,systemctl restart postgresql实际上可能无法重新启动已配置的PostgreSQL服务(我不知道为什么),因此不会应用配置文件中的更改。使用起来更安全pg_ctl(或pg_ctlcluster在Debian上)。
Skippy le Grand Gourou 2016年

4
我只是在Ubuntu 16.04 LTS测试这一点,在PostgreSQL 9.5, ,,systemctl reload postgresql 和所有渲染配置更改生效。systemctl restart postgresqlservice postgresql reloadservice postgresql restart
本·约翰逊

Answers:


464

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


编辑

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

  • 确保您已打开log_destination变量
  • 确保您打开了 logging_collector
  • 还请确保该log_directory目录已存在于目录内部data,并且postgres用户可以对其进行写入。

3
所以很好奇,这是否意味着除非重新启动服务器,否则PostgreSQL无法启用日志记录?在MySQL中,它就像“ SET GLOBAL general_log ='ON';”一样简单。
安东尼

7
我本人不知道是否可以使用像MySQL这样的SQL语句来执行此操作,但是您可以向正在运行的服务器发送命令以使用pg_ctl reload
Jarret Hardie

9
PostgreSQL还没有办法通过SQL语句更改其参数(从9.2版本开始)。大多数日志记录参数可以在不完全重启服务器的情况下进行更改,只需执行pg_ctl reload即可。但是,需要重新启动才能更改logging_collector。
格雷格·史密斯

6
使用Postgres 9.4和新ALTER SYSTEM命令,超级用户可以从SQL设置GUC参数。
Erwin Brandstetter,2015年

6
data答案中引用的目录不是其文字名称;它是指分配给data_directoryPostgreSQL配置文件中变量的路径。在Debian和Ubuntu GNU / Linux上,此文件通常位于/etc/postgresql/$v/main/postgresql.conf,即$v服务器版本。此外,在上述系统上,当时log_destination = 'stderr',输出将写入/var/log/postgresql/postgresql-$v-main.log$v服务器版本在哪里(而不是在服务器内部的某个位置data_directory)。
本·约翰逊

103

编辑您的/etc/postgresql/9.3/main/postgresql.conf,然后如下更改行。

注意:如果找不到该postgresql.conf文件,则只需输入$locate postgresql.conf一个终端

  1. #log_directory = 'pg_log' log_directory = 'pg_log'

  2. #log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'

  3. #log_statement = 'none' log_statement = 'all'

  4. #logging_collector = off logging_collector = on

  5. 可选的SELECT set_config('log_statement', 'all', true);

  6. sudo /etc/init.d/postgresql restart 要么 sudo service postgresql restart

  7. 在PostgreSQL中触发查询 select 2+2

  8. 查找当前登录 /var/lib/pgsql/9.2/data/pg_log/

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

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


2
在debian上,我还必须# log_destination = 'stderr'在配置文件中取消注释,然后才能起作用。
phihag

我已按照您的步骤进行了仔细检查,但此操作无效。需要重启吗?
Yohanes AI

2
如果您不想编写bash脚本,而只希望日志每月覆盖一次,请执行以下操作:log_filename = 'postgresql-%d.log'不,每次重新启动后它都不会覆盖,它将每天追加一次,并每月覆盖一次。当然,根据月份28、29、30、31,会有不同的日子-但您知道了。
sojim2'3

44
SELECT set_config('log_statement', 'all', true);

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


7
使用SET log_statement = 'all'或(对于交易级别)通常比较干净SET LOCAL log_statement = 'all'。您可能还对client_min_messageslog_min_messages设置感兴趣。
克雷格·林格

1
很好,因为我只想记录连接的消息。不幸的是,我得到了:permission denied to set parameter "log_statement"因为我的用户不是超级用户。
guettli 2014年

3
您可以向数据库管理员询问执行该功能的授权。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 ]
Rix Beck

35

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

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

2
logging_collector = on是必要的
wjin 2014年

奇迹般有效。我对配置文件的评论感到困惑Required to be on for csvlogs,认为该选项是记录查询输出,而不仅是语句,但事实并非如此。
Jacopofar

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

31

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

ALTER DATABASE your_database_name
SET log_statement = 'all';

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



20

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

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

10

基于此网页上的说明,仅提供运行PostgreSQL 9.2的CentOS 6.4(Red Hat 4.4.7-3)的更多详细信息:

  1. 设置(取消注释)log_statement = 'all'log_min_error_statement = error/var/lib/pgsql/9.2/data/postgresql.conf
  2. 重新加载PostgreSQL配置。对我来说,这是通过运行来完成的/usr/pgsql-9.2/bin/pg_ctl reload -D /var/lib/pgsql/9.2/data/
  3. 查找今天的登录信息 /var/lib/pgsql/9.2/data/pg_log/

4
你并不需要重新启动 -一个pg_ctl reload就足够了,而不会中断连接。不相信这个答案会给已经在这里的人增加任何东西。
Craig Ringer 2013年

1
@CraigRinger感谢您的评论,这是一个重要的事实。尝试您的建议后,我将更新答案。我写这个答案主要是为自己提供参考,因为当时我对UNIX的经验很少,并且我希望将所有必要的信息放在一个位置(例如postgresql.conf和日志文件的位置)。
佐尔坦

0

您还应该设置此参数来记录每个语句:

log_min_duration_statement = 0

0

我试图log_statement在一些postgres配置文件中设置,但实际上我们的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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.