如何启用记录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操作系统。
有什么想法吗?
如何启用记录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操作系统。
有什么想法吗?
在你的data/postgresql.conf
文件中,将log_statement
设置更改为'all'
。
编辑
看着你提供的新信息,我认为可能还有其他一些需要验证的设置:
log_destination
变量logging_collector
log_directory
目录已存在于data
目录内,并且postgres用户可以对其进行写入。pg_ctl reload
命令以重新加载配置。 - Jarret Hardiedata
目录并不是它的字面名称;它指的是在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
内部的某个位置)。 - Ben Johnson编辑您的/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中执行查询select 2+2
在/var/lib/pgsql/9.2/data/pg_log/
中查找当前日志
随着时间的推移,日志文件往往会增长很多,并可能导致机器崩溃。为了安全起见,请编写一个Bash脚本来删除日志并重新启动postgresql服务器。
感谢@paul,@Jarret Hardie ,@Zoltán,@Rix Beck,@Latif Premani
# log_destination = 'stderr'
才能使其正常工作。 - phihaglog_filename = 'postgresql-%d.log'
。不用担心,它不会在每次重启后覆盖文件,而是每天都会追加内容,并且每个月会覆盖旧的记录。当然,不同的月份有28、29、30、31天等等,但您应该能明白意思。 - sojim2select pg_reload_config();
而不必在第6步重启服务。 - jamesthollowelllogging_collector = on
需要重新启动服务器 - 即运行 SELECT pg_reload_conf();
可以与其他 postgresql.conf
参数一起工作,但不能与该参数一起工作 - 您可以在重新加载后运行 SELECT name, pending_restart FROM pg_settings WHERE name = 'logging_collector';
来检查这一点。这真是遗憾 - 我认为这最多是个小问题,最坏的情况下是个错误。 - undefined供参考:其他解决方案仅记录来自默认数据库(通常为postgres
)的语句。要记录其他数据库,请使用他们的解决方案,然后:
最初的回答:
ALTER DATABASE your_database_name
SET log_statement = 'all';
参考:https://serverfault.com/a/376888 / log_statement
"Original Answer"的意思是"最初的回答"。
如果您想了解有关IT技术的更多信息,请参阅上面提供的链接。
log_statement = all
对于相应的数据库集群 - 如所接受的答案建议的那样 - 影响该集群中所有数据库 - 可以被每个数据库的设置覆盖。 - Erwin BrandstetterSELECT set_config('log_statement', 'all', true);
在连接后,具有相应用户权限的用户可以使用上述查询。这将影响日志记录,直到会话结束。
SET log_statement = 'all'
或(对于事务级别)SET LOCAL log_statement ='all'
。您可能还会对client_min_messages
和log_min_messages
设置感兴趣。 - Craig Ringer您还需要在PostgreSQL中添加这些行并重新启动服务器:
log_directory = 'pg_log'
log_filename = 'postgresql-dateformat.log'
log_statement = 'all'
logging_collector = on
以上回答都很好。我使用以下配置
log_line_prefix = '%t %c %u ' # time sessionid user
log_statement = 'all'
根据这个网页上的说明,以下是关于运行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 = error
。/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
命令就足够了,而且不会中断连接。我不确定这个答案是否有助于已经存在的答案。 - Craig Ringerpostgresql有一个相关扩展名为"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;
logging_collector = on
。 (Explanation: This is a configuration setting for logging in a software system. The original text is already concise and clear, so I translated it directly without changing its meaning.) - bonyiiisystemctl reload postgresql
、systemctl restart postgresql
、service postgresql reload
和service postgresql restart
都会使配置更改生效。 - Ben JohnsonALTER DATABASE
明确启用实际数据库的日志记录(如此答案中所述)。 - Janaka Bandara