PostgreSQL 如何记录所有执行的 SQL 查询?
PostgreSQL 记录所有查询:postgresql.conf 中设 log_statement = 'all' 并开启 logging_collector。本文给出配置步骤及替代方案 log_min_duration_statement。
核心配置:在 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';,只对该用户的会话生效。