日志头脑风暴

来自 PostgreSQL Wiki
跳转到导航跳转到搜索

在 2009 年 9 月的 commitfest 期间,至少有 两个 补丁 被提交以修改日志记录。经过一些讨论,这两个补丁都被拒绝,建议在进行更多编码之前需要对整个想法进行更深入的讨论。

愿望清单

此列表包含一些我们希望能够做到但目前还无法实现的功能。

将不同数据库的操作记录到不同的文件
syslog 是错误日志的最佳目的地,但在我们写入大量日志时,性能会很差。最好将查询和性能日志拆分为文本日志。基于 syslog 的过滤不是解决方案,因为性能瓶颈在于 syslog 的通信。
根据源数据库进行不同的日志记录
例如:使 log_line_prefix、log_min_messages 等成为特定于数据库的
以上两点中的任何一个都可以使用除数据库之外的其他标准
例如:不同用户的操作最终记录在不同的位置
提供既可机器读取又可人工读取的日志。
我们有 csvlog,它对人类来说很难读,还有其他日志,对机器来说很难读。一种可能的解决方案是允许日志记录到两个文件 - 一个是 CSV 文件,另一个是“纯文本”文件。
添加修复最新日志文件名的选项
如果我们可以修复最新日志文件名,机器监控会更容易。最新消息始终位于同一文件的末尾。如果文件大小缩小,监控中间件将重新打开同一文件名。日志将在日志轮换时重命名;用于格式化的时间戳是从文件的创建时间获取的。
对具有不同编码的数据库使用唯一的服务器日志编码
我们目前将不同编码的日志合并到一个文件中。服务器日志的编码应独立于数据库编码指定。尽管 UTF-8 可能是唯一合理的编码。
服务器日志和客户端消息中的不同本地化
我们对服务器日志和客户端消息使用一个 lc_messages,但最好在其中使用不同的编码。DBA 和用户可能希望使用不同的本地化。
在错误消息中报告对象名称的附加字段
程序可以在不解析消息文本的情况下从消息中提取相关对象的名称和模式名称。
NOT NULL 违反和错误消息

实现思路

使用执行器钩子进行查询日志记录
查询日志记录可以在外部模块中实现,我们可以避免将其包含在核心功能中。我们在 8.4 中有 ExecutorStart_hook,但需要额外的 ProcessUtility_hook 来过滤 DDL 命令。
日志记录钩子(已拒绝)
在 elog 中添加 send_message_to_server_log_hook,并在用户定义的模块中执行愿望清单中列出的所有操作。但依赖可加载模块的这种关键行为是一个糟糕的主意 [1]