PostgreSQL 18 预览: 更细粒度的登录日志

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