如何启用 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
systemctl restart postgresql
可能实际上不会重新启动您已配置的 PostgreSQL 服务(我还不明白为什么),因此不会应用配置文件中的更改。使用 pg_ctl
(或 Debian 上的 pg_ctlcluster
)更安全。
systemctl reload postgresql
、systemctl restart postgresql
、service postgresql reload
和 service postgresql restart
所有渲染配置更改都有效。
ALTER DATABASE
(如 this answer)显式启用实际数据库的日志记录
在您的 data/postgresql.conf
文件中,将 log_statement
设置更改为 'all'
。
编辑
查看您的新信息,我想说可能还有其他一些设置需要验证:
确保您已打开 log_destination 变量
确保打开 logging_collector
还要确保 log_directory 目录已经存在于数据目录中,并且 postgres 用户可以写入它。
编辑您的 /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
# log_destination = 'stderr'
才能工作。
log_filename = 'postgresql-%d.log'
并且不会在每次重新启动后覆盖,它将每天追加并覆盖每个月。当然,根据 28、29、30、31 月份的不同,会有不同的日子——但你明白了。
select pg_reload_config();
,而不是在步骤 6 中重新启动服务。
仅供参考:其他解决方案只会记录默认数据库中的语句(通常是 postgres
)来记录其他语句;从他们的解决方案开始;然后:
ALTER DATABASE your_database_name
SET log_statement = 'all';
参考:https://serverfault.com/a/376888 / log_statement
postgresql.conf
中设置 log_statement = all
- 正如公认的答案所暗示的那样 - 会影响该集群的 所有 数据库 - 这可以被每个数据库的设置所推翻。
SELECT set_config('log_statement', 'all', true);
有相应的用户权限可以在连接后使用上面的查询。这将影响日志记录,直到会话结束。
SET log_statement = 'all'
或(对于事务级别)SET LOCAL log_statement = 'all'
通常更简洁。您可能还对 client_min_messages
和 log_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 ]
您还需要在 PostgreSQL 中添加这些行并重新启动服务器:
log_directory = 'pg_log'
log_filename = 'postgresql-dateformat.log'
log_statement = 'all'
logging_collector = on
Required to be on for csvlogs
注释感到困惑,认为此选项是记录查询输出而不仅仅是语句,但事实并非如此。
+1 以上答案。我使用以下配置
log_line_prefix = '%t %c %u ' # time sessionid user
log_statement = 'all'
根据 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
就足够了,并且不会中断连接。不相信这个答案会给已经在这里的人增加任何东西。
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”的新视图。在此视图中,您可以看到所有已执行的查询。
您还应该设置此参数以记录每条语句:
log_min_duration_statement = 0
我试图在一些 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
动态地,我们可以通过 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。我们可以通过重新加载配置动态启用/禁用日志记录。
我希望这应该会有所帮助。
pg_ctl reload
重新加载配置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
内的某个位置)。