当前位置:  开发笔记 > 编程语言 > 正文

如何记录PostgreSQL查询?

如何解决《如何记录PostgreSQL查询?》经验,为你挑选了8个好方法。

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

有任何想法吗?



1> Jarret Hardi..:

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


编辑

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

确保你已打开log_destination变量

确保你打开 logging_collector

还要确保log_directory目录中已存在该data目录,并且postgres用户可以写入该目录.


PostgreSQL还没有办法通过SQL语句更改其参数(截至9.2).通过执行pg_ctl reload,可以在不重启服务器的情况下更改大多数日志记录参数.但是,需要重新启动才能更改logging_collector.
我自己不知道是否有办法使用像MySQL这样的SQL语句,但你可以发送一个正在运行的服务器命令来重新加载配置`pg_ctl reload`
使用Postgres 9.4和新的[`ALTER SYSTEM`](http://www.postgresql.org/docs/current/interactive/sql-altersystem.html)命令,超级用户可以从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`里面的某个位置.
所以只是好奇,这是否意味着PostgreSQL无法启用日志记录,除非我重新启动服务器?在MySQL中,它就像"SET GLOBAL general_log ='ON';"一样简单.

2> vijay..:

编辑您的/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' log_statement = 'all'

    #logging_collector = off logging_collector = on

    可选:SELECT set_config('log_statement', 'all', true);

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

    postgresql中的fire查询 select 2+2

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

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

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


在debian上,我还必须在配置文件中取消注释`#log_destination ='stderr'`。
如果您不想编写bash脚本,而只希望日志每月覆盖一次,请执行以下操作:`log_filename ='postgresql-%d.log'`并且没有,每次重新启动后都不会覆盖,它将为每个追加天,并覆盖每个月。当然,根据月份28、29、30、31,会有不同的日子-但您知道了。

3> Rix Beck..:
SELECT set_config('log_statement', 'all', true);

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


使用`SET log_statement ='all'`或(对于事务级别)`SET LOCAL log_statement ='all'`通常更干净.您可能还对`client_min_messages`和`log_min_messages`设置感兴趣.
您可以向DB管理员询问执行该功能的授权.`GRANT {EXECUTE | ALL [PRIVILEGES]} ON {FUNCTION function_name([[argmode] [arg_name] arg_type [,...]])[,...] | SCHEMA schema_name中的所有函数[,...]}到{[GROUP] role_name | PUBLIC} [,...] [WITH GRANT OPTION]`

4> 小智..:

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

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


logging_collector = on是必要的

5> A T..:

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

ALTER DATABASE your_database_name
SET log_statement = 'all';

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



6> Chad Birch..:

设置log_statementall:

错误报告和记录 - log_statement



7> Shekhar..:

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

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



8> Zoltán..:

只是为了获得运行PostgreSQL 9.2的CentOS 6.4(Red Hat 4.4.7-3)的更多细节,基于此网页上的说明:

    设置(取消注释)log_statement = 'all'log_min_error_statement = error/var/lib/pgsql/9.2/data/postgresql.conf.

    重新加载PostgreSQL配置.对我来说,这是通过跑步来完成的/usr/pgsql-9.2/bin/pg_ctl reload -D /var/lib/pgsql/9.2/data/.

    查找今天的登录信息 /var/lib/pgsql/9.2/data/pg_log/


你不需要*restart* - `pg_ctl reload`就足够了,并且不会中断连接.不相信这个答案会给已经存在的人增加任何东西.
推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有