如何记录PostgreSQL查询?

Pau*_*aul 354 postgresql logging

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

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

log_directory = 'pg_log'                    
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_statement = 'all'
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

Jar*_*die 444

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


编辑

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

  • 确保你已打开log_destination变量
  • 确保你打开 logging_collector
  • 还要确保log_directory目录中已存在该data目录,并且postgres用户可以写入该目录.

  • PostgreSQL还没有办法通过SQL语句更改其参数(截至9.2).通过执行pg_ctl reload,可以在不重启服务器的情况下更改大多数日志记录参数.但是,需要重新启动才能更改logging_collector. (9认同)
  • 我自己不知道是否有办法使用像MySQL这样的SQL语句,但你可以发送一个正在运行的服务器命令来重新加载配置`pg_ctl reload` (7认同)
  • 使用Postgres 9.4和新的[`ALTER SYSTEM`](http://www.postgresql.org/docs/current/interactive/sql-altersystem.html)命令,超级用户可以从SQL设置GUC参数. (6认同)
  • 答案中引用的`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`里面的某个位置. (6认同)
  • 所以只是好奇,这是否意味着PostgreSQL无法启用日志记录,除非我重新启动服务器?在MySQL中,它就像"SET GLOBAL general_log ='ON';"一样简单. (3认同)
  • 对于使用 Docker 的用户:如果您不想创建配置文件只是为了启用日志记录,请将其添加到您的 docker-compose.yml 中:`command: postgres -c 'log_statement=all'` (2认同)

vij*_*jay 94

编辑您的/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中的fire查询 select 2+2

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

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

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

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

Rix*_*eck 39

SELECT set_config('log_statement', 'all', true);
Run Code Online (Sandbox Code Playgroud)

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

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

小智 35

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

log_directory = 'pg_log'                    
log_filename = 'postgresql-dateformat.log'
log_statement = 'all'
logging_collector = on
Run Code Online (Sandbox Code Playgroud)

  • logging_collector = on是必要的 (2认同)

A T*_*A T 26

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

ALTER DATABASE your_database_name
SET log_statement = 'all';
Run Code Online (Sandbox Code Playgroud)

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

  • 这应该是公认的答案——唯一具有实用价值的答案! (3认同)
  • 重新连接psql即可生效。 (3认同)
  • 引用的语句在 Postgres 9.4 或更高版本中有效,但主要段落是错误的。在`postgresql.conf`中为相应的数据库集群设置[`log_statement = all`](https://www.postgresql.org/docs/current/runtime-config-logging.html#GUC-LOG-STATEMENT) - 就像接受的答案表明 - 影响该集群的*所有*数据库 - 这可以被每个数据库设置推翻。 (2认同)

She*_*har 20

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

log_line_prefix = '%t %c %u ' # time sessionid user
log_statement = 'all'
Run Code Online (Sandbox Code Playgroud)


Zol*_*tán 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/

  • 你不需要*restart* - `pg_ctl reload`就足够了,并且不会中断连接.不相信这个答案会给已经存在的人增加任何东西. (4认同)

Del*_*nte 5

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'
Run Code Online (Sandbox Code Playgroud)

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

create extension pg_stat_statements;
Run Code Online (Sandbox Code Playgroud)

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


小智 5

您需要运行下面的查询,然后重新启动 PostgreSQL 以持久启用日志记录。*参数ALTER SYSTEM SET设置为postgresql.auto.conf而不是postgresql.conf

ALTER SYSTEM SET log_statement = 'all';
Run Code Online (Sandbox Code Playgroud)

并且,您需要运行以下任一查询,然后重新启动 PostgreSQL 以永久禁用日志记录:

ALTER SYSTEM RESET log_statement;
Run Code Online (Sandbox Code Playgroud)

或者:

ALTER SYSTEM SET log_statement = 'none';
Run Code Online (Sandbox Code Playgroud)

您还可以运行下面的查询,然后需要重新启动 PostgreSQL 以持久启用日志记录:

ALTER SYSTEM SET log_min_duration_statement = 0;
Run Code Online (Sandbox Code Playgroud)

并且,您还可以运行以下任一查询,然后需要重新启动 PostgreSQL 以永久禁用日志记录:

ALTER SYSTEM RESET log_min_duration_statement;
Run Code Online (Sandbox Code Playgroud)

或者:

ALTER SYSTEM SET log_min_duration_statement = -1;
Run Code Online (Sandbox Code Playgroud)

请注意,下面的这些查询无法持久启用或禁用日志记录:

SET SESSION log_statement = 'all'
SET log_statement = 'all'
SET LOCAL log_statement = 'all'
Run Code Online (Sandbox Code Playgroud)
SET SESSION log_min_duration_statement = 0;
SET log_min_duration_statement = 0;
SET LOCAL log_min_duration_statement = 0;
Run Code Online (Sandbox Code Playgroud)

或者:

RESET log_statement;
SET SESSION log_statement = 'none'
SET log_statement = 'none'
SET LOCAL log_statement = 'none'
Run Code Online (Sandbox Code Playgroud)
RESET log_min_duration_statement;
SET SESSION log_min_duration_statement = -1;
SET log_min_duration_statement = -1;
SET LOCAL log_min_duration_statement = -1;
Run Code Online (Sandbox Code Playgroud)