由 John Doe 四月 7, 2025
你有没有遇到过登录数据库卡顿的情况?现在,PostgreSQL 的登录日志可以细化到登录过程的各个阶段了。
特性提交日志
对log_connections
的输出进行模块化处理。
将布尔型的配置参数log_connections
转换为一个列表型的配置参数,该列表由要记录的连接过程的阶段组成。
这使用户能够更灵活地控制连接日志的数量和类型。
当前log_connections
的选项有 “receipt”(接收)、“authentication”(认证)和 “authorization”(授权)。空字符串表示禁用所有连接日志的记录。“all”(全部)表示启用所有可用的连接日志记录。
为了保持向后兼容性,log_connections
布尔型参数中最常用的值仍然受支持:on(开启)、off(关闭)、1、0、true(真)、false(假)、yes(是)、no(否)。请注意,以前支持的 “on”、“off”、“true”、“false”、“yes” 和 “no” 的字符串现在不再受支持。
讨论:https://postgr.es/m/flat/CAAKRu_b_smAHK0ZjrnL5GRxnAVWujEXQWpLXYzGbmpcZd3nLYw%40mail.gmail.com
示例
很多用户由于审计要求会启用log_connections
。它是一个简单的布尔值参数,只有开启或关闭两种状态。一旦启用,每次有新的数据库连接,都会被记录到 PostgreSQL 日志文件中。在 PostgreSQL 17 及之前版本中,日志文件里记录一个连接的典型内容如下:
2025-04-03 14:50:05.607 CST - 1 - 6195 - [local] - [unknown]@[unknown] - 0LOG: connection received: host=[local]
2025-04-03 14:50:05.607 CST - 2 - 6195 - [local] - postgres@postgres - 0LOG: connection authenticated: user="postgres" method=trust (/u02/pgdata/17/pg_hba.conf:117)
2025-04-03 14:50:05.607 CST - 3 - 6195 - [local] - postgres@postgres - 0LOG: connection authorized: user=postgres database=postgres application_name=psql
如你所见,这里记录了三个阶段:连接接收、认证和授权。通过比较记录的时间戳,你可以了解每个阶段完成所需的时间。但这也带来一个问题,如果连接数量很多,日志文件中会产生大量冗余信息。
在 PostgreSQL 18 中,这种情况有所改变,log_connections
不再是一个简单的布尔值,而是一个由支持的值组成的列表。有效的值有:
- receipt
- authentication
- authorization
- [空字符串]
从这个列表就能看出变化。现在,你可以选择仅启用特定阶段的日志记录,如果你不需要,无需一次性启用所有阶段的记录。空字符串表示禁用连接日志记录。
例如,如果你只对授权阶段感兴趣,现在可以这样配置:
select version();
version
--------------------------------------------------------------------
PostgreSQL 18devel on x86_64-linux, compiled by gcc-14.2.1, 64-bit
(1 row)
alter system set log_connections = 'authorization';
select pg_reload_conf();
pg_reload_conf
----------------
t
(1 row)
从现在起,日志文件中只会记录 “authorization”(授权)阶段的信息:
2025-04-03 15:10:41.710 CST - 1 - 6617 - [local] - postgres@postgres - 0LOG: connection authorized: user=postgres database=postgres application_name=psql
如果你只关心这个阶段,这将大大减少日志记录量。添加所有阶段的配置会恢复到以前记录所有阶段的行为:
alter system set log_connections = 'authorization','receipt','authentication';
select pg_reload_conf();
pg_reload_conf
----------------
t
(1 row)
这样设置以后,日志记录看起来和以前完全一样:
2025-04-03 15:14:19.520 CST - 1 - 6629 - [local] - [unknown]@[unknown] - 0LOG: connection received: host=[local]
2025-04-03 15:14:19.521 CST - 2 - 6629 - [local] - postgres@postgres - 0LOG: connection authenticated: user="postgres" method=trust (/u02/pgdata/PGDEV/pg_hba.conf:117)
2025-04-03 15:14:19.521 CST - 3 - 6629 - [local] - postgres@postgres - 0LOG: connection authorized: user=postgres database=postgres application_name=psql
非常不错的体验。感谢社区的所有相关人员。
参考
提交日志:https://git.postgresql.org/pg/commitdiff/9219093cab2607f34ac70612a65430a9c519157f