PostgreSQL

关注公众号 jb51net

关闭
首页 > 数据库 > PostgreSQL > PostgreSQL Log日志模块

PostgreSQL Log日志模块原理及存在的问题详解

作者:总想玩世不恭

这篇文章主要给大家介绍了关于PostgreSQL Log日志模块原理及存在的问题的相关资料,先日志在我们开发过程中占据了一个非常重要的地位,是开发和运维管理之间的桥梁,文中通过代码介绍的非常详细,需要的朋友可以参考下

背景

PG 的日志模块是一个相对独立的模块,主要功能就是打印用户的操作日志以及一些异常报错信息。本文仅讲述 logging_collector 参数开启的情况。

日志模块原理

Syslogger 核心模块

PG 有各种各样的进程,其中 syslogger 进程专门用于打印日志信息。

而其余进程打印日志的方法如出一辙:将需要打印的信息发送给 syslogger 进程,由其统一负责打印。

syslogger 的大体逻辑如下图所示:

日志消息通信

PG 的其余进程如果有需要打印的日志,通常会调用 elog 或者 ereport 来打印。而这两个函数会将日志消息分成若干个 chunk 发送给 syslogger 进程,每个 chunk 的结构可参考下图(源码中的 PipeProtoChunk 结构)

syslogger 在接收到日志消息后,将其按照 pid 进行分组,相同的 pid 说明日志消息来源于同一进程,将其组装起来,当收到包含 is_last 标记的最后一个 chunk 后,将整条日志消息打印到日志文件。

日志轮转

所谓日志轮转,指的就是不想继续写当前日志文件了,需要新找一个日志文件继续写日志。

PG 的日志轮转是一个坑非常多的地方,因为它由下面四个参数同时控制:

这几个参数的具体使用可参考 PG 官方文档。看完上面的介绍,想必大家已经精通日志参数设置了,那么接下来做几道题检验自己的学习成果。

假如,我们按照以下值设定日志相关参数

log_filename='postgres_%d_%h.log'
log_rotation_age = 2h
log_rotation_size = 10MB
log_truncate_on_rotation = on

问题一

问题二

问题三

问题四

问题五

上面问题都能搞懂,基本也没什么坑了。

存在的问题

刷盘性能

当前情况下,在 log_statement 参数设置成 all 时,性能下降会非常厉害。因为 PG 的日志在刷盘时的默认策略为:每写一行就刷盘。Linux 提供的刷盘模式可分为以下三种:

当前 PG 采用第二种行缓冲模式,优点是日志出来的即时性更高,缺点就是对性能有不小的影响。

日志轮转

日志轮转的逻辑设计虽然勉强算是合理的(不会丢日志),但是理解成本很高,且有可能出现某个日志文件存在了非常非常久(上一节问题 4 的变种),一直没被删掉,需要依赖人工手动删除。

参考资料

总结

到此这篇关于PostgreSQL Log日志模块原理及存在的问题详解的文章就介绍到这了,更多相关PostgreSQL Log日志模块内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文