debug_connection 是 postgresql 的深度调试参数,仅在源码编译启用 --enable-debug 且 log_min_messages ≤ debug5 时生效,用于输出匹配 ip/cidr 的连接底层细节日志。

debug_connection 是 PostgreSQL 提供的一个配置参数,用于对匹配特定 IP 地址或 CIDR 网段的客户端连接,输出极其详细的底层连接调试日志(包括 SSL 握手、认证流程、协议版本协商等),但**仅在编译时启用了 --enable-debug 且运行于 log_min_messages = debug5 或更低级别时才生效**。它不是常规日志开关,而是面向开发与深度排障的诊断工具。
确认 PostgreSQL 编译支持 debug_connection
该参数默认不生效——若 PostgreSQL 是从发行版仓库安装(如 apt、yum、brew),几乎肯定未启用调试编译。需验证:
- 执行
SELECT version();,查看输出是否含DEBUG字样(例如PostgreSQL 16.3 (Ubuntu 16.3-1.pgdg22.04+1) DEBUG) - 若无 DEBUG 标识,
debug_connection即使设了也完全静默;此时必须自行源码编译:./configure --enable-debug --enable-cassert ... && make && sudo make install
正确设置 debug_connection 和日志级别
仅设置 debug_connection 不够,必须同步放宽日志输出阈值:
- 在
postgresql.conf中添加或修改两行:
log_min_messages = debug5
-
debug_connection支持单 IP(如'192.168.1.100')、CIDR(如'10.0.0.0/8'),多个地址用逗号分隔(无空格):'192.168.1.100,172.16.0.0/12' -
log_min_messages = debug5是最低要求;设为debug4或更高则日志被截断,看不到完整握手细节 - 修改后需
SELECT pg_reload_conf();(无需重启)
观察日志内容与典型输出位置
匹配 IP 的客户端发起连接(含失败连接)时,日志中会出现大量以 DEBUG: 开头的行,例如:
DEBUG: SSL negotiation with 192.168.1.100:54322: starting
DEBUG: SSL negotiation: server cert sent
DEBUG: SSL negotiation: client certificate request sent
DEBUG: pg_hba.conf rejection: host 192.168.1.100 user appuser database mydb
- 这些日志默认写入集群日志文件(由
logging_collector控制,路径见log_directory+log_filename) - 若使用
log_destination = stderr且 PostgreSQL 前台运行,日志会直接打印到终端 - 注意:日志量极大,仅临时开启,排查完毕立即注释掉
debug_connection并调高log_min_messages
替代方案:普通环境下获取连接详情
若无法重编译 PostgreSQL,仍可获得较详细连接信息:
- 启用标准连接日志:
log_connections = on+log_disconnections = on,记录成功/断开时间、用户、数据库、IP - 结合
log_line_prefix = '%m [%p] %h %u %d '明确标识来源 - 使用
pg_stat_activity实时查当前连接:SELECT client_addr, backend_start, state, application_name FROM pg_stat_activity WHERE client_addr = '192.168.1.100'; - 抓包分析(如
tcpdump -i any port 5432 -w pg.pcap)可还原完整协议交互,但需解密 SSL 流量(需服务器私钥)










