PostgreSQL 14通过libpq改进logging

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
日志服务 SLS,月写入数据量 50GB 1个月
简介: PostgreSQL 14通过libpq改进logging

PostgreSQL 14通过libpq改进logging


PG14中增强了libpq功能,以跟踪应用程序的服务器/客户端通信的可用性。它添加了新的选项控制输出格式。


背景


libpq是客户端库之一,用户可以运行PQtrace函数记录客户端-服务端通信。这个通信是PG使用的一种协议信息,包括:消息类型的标识符,消息长度,交换信息的消息内容。

应用开发者可以使用这个日志判断通信是否按预期执行。使用下面的的语句作为一个例子:

CREATE TABLESPACE regress_tblspacewith

LOCATION '/home/postgres/src/test/regress/testtablespace'

WITH (random_page_cost = 3.0);

PG13中调用PQtrace的应用会输出下面类型的日志到指定文件中:

PG13libpq产生的日志

需要注意,当前PG版本的PQtrace日志输出中不包含时间戳,因此不能作为参考分析慢查询。另外,因为消息标识符、server/client消息长度、输出内容分别单独一行,可靠性比较低,协议消息的分析比较困难。标记1ZC是协议消息的标识符。要了解每个标识符的含义,参考手册中Message Formats部分:

https://www.postgresql.org/files/documentation/pdf/13/postgresql-13-A4.pdf#page=2217


功能改进概述


PG14中,改进了PQtrace函数,使得输出的日志更具可读性并且包含时间戳。添加了新的函数PQsetTraceFlags用以控制时间戳的输出。

改进日志输出

PG14中改进的trace函数产生了下面类似的输出:

PG 14libpq产生的日志

1)包含了时间戳

2)消息方向的代码更加直观:F表示前端,B表示后端

3)输出正式的消息名称,而不是协议消息的标识符

4)有意义的协议消息以一行形式输出

日志检索方法

和以前一样,通过调用libpqPQtrace函数开始记录日志。如果不需要输出时间戳,可以通过PQsetTraceFlags函数控制。


影响


PQtrace输出时间戳,可以帮助用户识别慢查询。如果应用程序突然变慢,可以通过查看日志中时间戳差异来确定server或者client耗费了更长时间。有意义的协议消息以一行形式输出,使得不熟悉lipq日志的人可以轻松了解serverclient之间发送的通信。通过使用PQsetTraceFlags函数控制是否输出时间戳,可以使用此日志进行回归测试。通过不输出时间戳,可以使用预期测试运行的结果填充日志,并轻松第将其与测试运行中得到的日志进行比较。


未来


PG14libpq日志将包含时间戳和更具可读性的文本。在后续版本中,我们会在下面几个方面进一步提升可用性:

1) 当前函数将日志写入指定给PQtrace函数的文件。某些情况下,会使日志文件膨胀非常大,从而影响文件操作。为解决这个问题,我们希望提供一个功能来指定文件的最大大小。

2) 希望添加环境变量和连接参数,以设置日志输出的目录位置,以及日志文件名来适应环境,无需修改应用程序。


原文


https://www.postgresql.fastware.com/blog/improved-logging-by-libpq-in-postgresql-14

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
关系型数据库 开发工具 C语言
PostgreSQL libpq开发入门
简单入门C语言开发基于PostgreSQL libpq应用
|
Rust 关系型数据库 编译器
Rust调用libpq访问PostgreSQL
Rust调用libpq访问PostgreSQL
|
关系型数据库 Linux PostgreSQL
LINUX下载编译libpq(postgresql)
LINUX下载编译libpq(postgresql)
548 0
|
关系型数据库 程序员 网络安全
PostgreSQL 10.1 手册_部分 IV. 客户端接口_第 33 章 libpq - C 库
第 33 章 libpq - C 库 目录 33.1. 数据库连接控制函数 33.1.1. 连接字符串 33.1.2. 参数关键词 33.2. 连接状态函数 33.3. 命令执行函数 33.3.
1455 0
|
关系型数据库 数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 IV. 客户端接口_第 33 章 libpq - C 库_33.21. 例子程序
33.21. 例子程序 这些例子和其他例子可以在源代码发布的src/test/examples目录中找到。 例 33.1. libpq 例子程序 1 /* * testlibpq.c * * 测试 libpq(PostgreSQL 前端库) 的 C 版本。
1194 0
|
关系型数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 IV. 客户端接口_第 33 章 libpq - C 库_33.20. 编译 libpq 程序
33.20. 编译 libpq 程序 要编译(即编译并且链接)一个使用libpq的程序,你需要做下列所有的事情: 包括libpq-fe.h头文件: #include <libpq-fe.h> 如果你无法这样做,那么你通常会从你的编译器得到像这样的错误消息: foo.
1453 0
|
安全 关系型数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 IV. 客户端接口_第 33 章 libpq - C 库_33.19. 在线程化程序中的行为
33.19. 在线程化程序中的行为 libpq默认是可再入的并且是线程安全的。你可能需要使用特殊的编译器命令行选项来编译你的应用代码。参考你的系统文档来了解如何编译启用线程的应用,或者在src/Makefile.global中查找PTHREAD_CFLAGS和PTHREAD_LIBS。
1175 0
|
安全 关系型数据库 网络安全
PostgreSQL 10.1 手册_部分 IV. 客户端接口_第 33 章 libpq - C 库_33.18. SSL 支持
33.18. SSL 支持 33.18.1. 服务器证书的客户端验证 33.18.2. 客户端证书 33.18.3. 不同模式中提供的保护 33.18.4. SSL 客户端文件使用 33.18.5. SSL 库初始化 PostgreSQL本地支持使用SSL 连接加密客户端/服务器通信以提高安全性。
1588 0
|
关系型数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 IV. 客户端接口_第 33 章 libpq - C 库_33.17. 连接参数的 LDAP 查找
33.17. 连接参数的 LDAP 查找 如果libpq已经在编译时打开了 LDAP 支持(configure的选项--with-ldap),就可以通过 LDAP 从一个中央服务器检索host或dbname之类的连接参数。
1356 0
|
关系型数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 IV. 客户端接口_第 33 章 libpq - C 库_33.16. 连接服务文件
33.16. 连接服务文件 连接服务文件允许 libpq 连接参数与一个单一服务名称关联。那个服务名称可以被一个 libpq 连接指定,与其相关的设置将被使用。这允许在不重新编译 libpq 应用的前提下修改连接参数。
1116 0