PostgreSQL 14 中增强了 libpq 功能用于跟踪应用程序的服务器/客户端通信的可用性,具有改进的格式和控制输出的选项。
背景
libpq 是客户端库之一,用户可以在其中运行 PQtrace 函数来记录客户端-服务器通信。此通信是 PostgreSQL 使用的协议消息,包含:
- 消息类型的消息标识符
- 消息的长度,以及
- 交换信息的消息内容
应用程序开发人员可以使用此日志来确定通信是否按预期进行。
以下面的语句为例:
CREATE TABLESPACE regress_tblspacewith
LOCATION '/home/postgres/src/test/regress/testtablespace'
WITH (random_page_cost = 3.0);
在 PostgreSQL 13 之前,调用 PQtrace 的应用程序会向指定文件输出如下日志:
From backend> Z 1
From backend (#4)> 5
From backend> I
To backend> Msg Q
To backend> "CREATE TABLESPACE regress_tblspacewith LOCATION '/home/postgres/…
To backend> Msg complete, length 133
From backend> C 1
From backend (#4)> 22
From backend> "CREATE TABLESPACE"
From backend> Z
From backend (#4)> 5
From backend> I
PostgreSQL 13 中 libpq 生成的日志
请注意,当前 PostgreSQL 版本中 PQtrace 的日志输出不包含时间戳,因此无法参考它来调查处理缓慢。
另外,由于消息标识、服务器/客户端消息长度和内容分别在单独的行中输出,可读性差,协议消息分析非常困难。上面日志中标记为1 的Z和C是协议消息的标识符。要了解每个标识符的含义,您需要参考 PostgreSQL 文档的消息格式部分。icon-external-link-02-variation-01
功能改进概述
在 PostgreSQL 14 中,改进了 PQtrace 函数,使日志更具可读性并输出时间戳。此外,还添加了一个新函数 PQsetTraceFlags 来控制时间戳的输出。
改进的日志输出
PostgreSQL 14 中改进的跟踪函数产生类似于以下的输出:
2021-06-30 09:21:56.366698 B 5 ReadyForQuery I
2021-06-30 09:21:56.366741 F 133 Query "CREATE TABLESPACE regress_tblspacewith LOCATION '/home/postgres/…
2021-06-30 09:21:56.367679 B 22 CommandComplete "CREATE TABLESPACE"
2021-06-30 09:21:56.367696 B 5 ReadyForQuery I 4
PostgreSQL 14 中 libpq 生成的日志
这是与上面显示的 PostgreSQL 13 的示例日志输出完全相同的操作的日志。有四点改进:
- 现在包括时间戳。
- 消息方向代码直观:F为前端,B为后端。
- 输出正式的消息名称,而不是协议消息的标识符。
- 一行输出有意义的协议消息。
日志检索方法
和以前一样,您通过调用 libpq 的 PQtrace 函数开始记录 - 这与以前的版本相同。如果您不需要时间戳输出,您可以使用新引入的PQsetTraceFlagsicon-external-link-02-variation-01函数来控制它,该函数是作为此改进的一部分添加的。
影响
PQtrace 现在输出时间戳这一事实允许用户识别耗时的操作。例如,如果应用程序突然变慢,您
可以通过查看日志中的时间戳差异来确定服务器或客户端是否需要更长的时间来处理。
有意义的协议消息在一行中输出,使不熟悉 libpq 日志的人可以轻松了解服务器和客户端之间发生的通信。
通过使用 PQsetTraceFlags 函数控制是否输出时间戳,您可以使用此日志进行回归测试。通过不输出时间戳,您可以使用预期测试运行的结果预先填充日志,并轻松地将其与从测试运行中获得的日志进行比较。
对将来的思考
img-abstract-0s-and-1s-02PostgreSQL 14 中的 libpq 日志将包含时间戳和更具可读性的文本。
在以下版本中,我们将检查这些区域以进一步增强可用性:
- 当前函数将日志写入指定给 PQtrace 函数的文件。在某些情况下,这会导致非常大的日志文件和缓慢的文件操作。为了解决这个问题,我们希望提供一个功能来指定最大文件大小。
- 我们希望添加环境变量和连接参数,以设置日志目标目录和日志文件名以适应每个环境,而无需更改应用程序。




