PostgreSQL 如何记录所有执行的 SQL 查询?

PostgreSQL 记录所有查询:postgresql.conf 中设 log_statement = 'all' 并开启 logging_collector。本文给出配置步骤及替代方案 log_min_duration_statement。

最佳实践
PostgreSQL 如何记录所有执行的 SQL 查询?封面

核心配置:在 postgresql.conf 中取消注释并修改 log_statement = 'all'logging_collector = on,重启 PostgreSQL 后所有 SQL 语句会记录到日志文件中。生产环境慎用 all,建议用 log_min_duration_statement 只记慢查询。

配置步骤

编辑 postgresql.conf(通常在数据目录或 /etc/postgresql/ 下):

logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_statement = 'all'

重启 PostgreSQL:

sudo systemctl restart postgresql
# 或
sudo service postgresql restart

日志文件位于数据目录的 pg_log/ 子目录中。

运行时临时开启

ALTER SYSTEM SET log_statement = 'all';
SELECT pg_reload_conf();

各 log_statement 级别对比

记录内容
none 不记录(默认)
ddl CREATE、ALTER、DROP 等结构变更
mod ddl + INSERT/UPDATE/DELETE
all 所有语句(含 SELECT)

更推荐的方案

log_statement = 'all' 在高并发下会产生大量日志影响性能。更实用的做法是:

log_min_duration_statement = 500   # 记录执行超过 500ms 的语句及其耗时

观测云对照

观测云提供 PostgreSQL 集成,采集慢查询日志和数据库指标,在控制台统一分析查询性能趋势,配置慢查询告警,不用到数据库服务器上翻日志文件。

常见问题(FAQ)

Q:log_statement = 'all' 对性能影响大吗?
A:会。每条 SQL 都要写日志,高并发下 I/O 开销明显,且日志文件会快速增长。建议只用于短期调试。

Q:日志文件路径在哪?
A:相对路径基于数据目录。查看数据目录位置:SHOW data_directory;。日志在 {数据目录}/pg_log/ 下。

Q:能只记录某个用户的查询吗?
A:可以:ALTER USER app_user SET log_statement = 'all';,只对该用户的会话生效。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台