PostgreSQL 如何记录所有查询或慢查询日志?

PostgreSQL 记录慢查询:log_min_duration_statement 设置阈值(毫秒);log_statement = 'all' 记录所有 SQL(生产慎用)。本文给出配置方法和分析工具。

最佳实践
PostgreSQL 如何记录所有查询或慢查询日志?封面

记录慢查询:log_min_duration_statement = 1000(超过 1000ms 的查询记入日志)。记录所有查询:log_statement = 'all'(开销大,仅调试用)。两个参数都在 postgresql.conf 中配置。

记录慢查询

编辑 postgresql.conf

log_min_duration_statement = 1000   # 超过 1 秒的查询记入日志(毫秒)

设为 0 记录所有查询的耗时(等效于 log_statement='all' 但更简洁),设为 -1 禁用。

改完执行 SELECT pg_reload_conf();pg_ctl reload 热加载,不用重启。

记录所有查询

log_statement = 'all'

可选值:none(默认)、ddl(只记建表/改表等)、mod(ddl + DML 写操作)、all(全部)。生产环境慎用 all

建议同时配置的参数

log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '
log_checkpoints = on
log_connections = on
log_disconnections = on
log_lock_waits = on
log_temp_files = 0

log_line_prefix 加上时间、用户、数据库名等信息,让日志更有用。

分析工具

# pgBadger 生成 HTML 分析报告(慢查询 TOP、耗时分布等)
pgbadger /var/log/postgresql/postgresql.log -o report.html

观测云对照

观测云提供 PostgreSQL 集成,可采集慢查询日志和性能指标,在监控视图中统一分析慢查询趋势并配置告警,比逐台登录分析日志效率高得多。

常见问题(FAQ)

Q:log_min_duration_statement 设为 0 和 log_statement='all' 有什么区别?
A:前者记录每条语句的耗时(更有用),后者记录语句本身。日常用前者。

Q:可以只对某个数据库开启吗?
A:可以:ALTER DATABASE mydb SET log_min_duration_statement = 1000;,只对该库的会话生效。

Q:日志文件在哪?
A:取决于 log_destinationlogging_collector 配置。常见在 /var/log/postgresql/ 或数据目录的 log/ 子目录。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台