PostgreSQL 慢查询日志的所有参数均在 postgresql.conf 中配置,分为日志开关控制、慢查询阈值、日志内容、日志文件轮转、日志存储路径五大类,附生产推荐值与作用说明。
一、基础日志总开关(必须开启才能记录慢 SQL)
1. logging_collector
ini
logging_collector = on
作用:日志收集器总开关,
off时所有文件日志失效,仅输出控制台生产:强制
on
2. log_destination
ini
log_destination = 'csvlog'
可选值:stderr / csvlog / syslog
csvlog:推荐,结构化 CSV 日志,可用 pgBadger/pg_loganalyzer 解析过滤慢 SQLstderr:简单文本日志,可读性差
二、慢查询核心阈值参数(控制 “多慢才算慢日志”)
1. log_min_duration_statement(慢日志核心阈值)
ini
log_min_duration_statement = 100
单位:毫秒 ms
含义:执行耗时超过该值的 SQL,会被记录到慢日志
0:记录所有 SQL;-1:关闭慢查询记录推荐:业务系统
100~500,报表库1000
2. log_min_duration_sample(采样慢日志,高并发专用)
ini
log_min_duration_sample = 500
log_sample_rate = 0.1
作用:当 SQL 耗时超过阈值,按比例采样记录,避免高并发下日志爆炸
log_sample_rate:0~1,0.1 代表 10% 采样
三、日志记录内容控制(控制日志里打印哪些信息)
1. log_statement(控制记录哪些类型 SQL)
ini
log_statement = 'mod'
四个可选值:
none:不记录任何 SQL(仅慢日志会记录超过阈值的)ddl:仅记录建表、改表、索引等 DDL 语句mod:DDL + INSERT/UPDATE/DELETE(增删改,生产最常用)all:记录所有 SQL(SELECT 也全量打印,调试用,线上高并发慎用)
搭配 log_min_duration_statement:
log_statement=mod 只会完整打印 DML/DDL;SELECT 只有超过慢查询阈值才会记录。
2. log_connections / log_disconnections
ini
log_connections = on
log_disconnections = on
记录客户端连接、断开事件,排查连接暴涨、连接泄漏。
3. log_error_verbosity
ini
log_error_verbosity = verbose
控制日志详情:terse(简略) / default / verbose(最全)
verbose 会打印参数、上下文,排查慢 SQL 必备。
4. log_line_prefix(日志行前缀,关键定位信息)
ini
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a '
占位符说明(常用):
%t:时间戳%p:后端进程 PID%u:执行用户%d:数据库名%a:应用程序名称(区分不同业务服务)%l:行号作用:每条日志自带用户、库、应用,快速定位慢 SQL 来源。
5. log_parameter_max_length / log_parameter_max_length_on_error
ini
log_parameter_max_length = -1
-1:完整打印 SQL 绑定参数;0:不打印参数排查带参数慢查询时必须开启。
四、日志文件存储 & 轮转(防止日志打满磁盘)
1. log_directory
ini
log_directory = 'pg_log'
日志存放文件夹,相对路径在 PG 数据根目录,可配置绝对路径 /var/log/postgres。
2. log_filename
ini
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
日志文件名模板,按日期自动生成,便于按天拆分日志。
3. log_rotation_age
ini
log_rotation_age = 1d
日志轮转时间:1d = 每天生成新日志,单位 min/h/d。
4. log_rotation_size
ini
log_rotation_size = 100MB
单日志文件最大容量,超过自动切新文件,防止单个日志几十 G。
5. log_truncate_on_rotation
ini
log_truncate_on_rotation = on
同名日志文件自动覆盖,避免日志文件无限堆积。
五、辅助日志参数(锁、慢查询额外记录)
1. log_lock_waits
ini
log_lock_waits = on
deadlock_timeout = 1000
log_lock_waits:开启锁等待日志,SQL 等待锁超过 deadlock_timeout 则记录
排查并发锁等待、死锁阻塞必备
2. log_autovacuum_min_duration
ini
log_autovacuum_min_duration = 500
记录执行超时的自动清理任务,监控 autovacuum 慢、表膨胀问题。
六、生产环境完整标准配置模板
ini
# 总开关
logging_collector = on
log_destination = 'csvlog'
# 慢查询阈值:超过100ms记录
log_min_duration_statement = 100
# SQL记录范围:DDL+增删改
log_statement = 'mod'
# 日志详情、参数打印
log_error_verbosity = verbose
log_parameter_max_length = -1
# 日志前缀,定位用户/库/应用
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a '
# 连接日志
log_connections = on
log_disconnections = on
# 锁等待日志
log_lock_waits = on
deadlock_timeout = 1000
# 自动vacuum日志
log_autovacuum_min_duration = 500
# 日志存储与轮转
log_directory = '/var/log/postgres'
log_filename = 'pg-%Y-%m-%d.log'
log_rotation_age = 1d
log_rotation_size = 100MB
log_truncate_on_rotation = on
七、补充说明
修改
postgresql.conf后,执行SELECT pg_reload_conf();热加载,无需重启数据库;csvlog 日志推荐搭配 pgBadger 工具,一键统计 Top 慢 SQL、锁等待、执行频次;
高并发业务不建议
log_statement=all,会大量消耗 IO,只依靠log_min_duration_statement捕获慢查询即可。