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