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

跨实例分析时,可将生成的慢查询文件按 DataKit 文件采集 接入观测云。先核对文件路径与读权限,再用一条已知慢查询验证时间、数据库名和耗时的解析结果;SQL 中的敏感参数应在上报前处理。

常见问题(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_destination 和 logging_collector 配置。常见在 /var/log/postgresql/ 或数据目录的 log/ 子目录。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台