当前位置: 首页 > article >正文

PostgreSQL技术内幕21:SysLogger日志收集器的工作原理

0.简介

在前面文章中介绍了事务模块用到的事务日志结构和其工作原理,本文将介绍日志的另一个部分,操作日志,主要去描述SysLogger日志的工作原理,流程以及其中关键的实现:日志轮转,刷盘性能问题等,同时基于这个实现考虑统一日志的设计方法(可以借鉴的思想)。

1.开启和使用方式

开启SysLogger进程需要在postgresql.conf中,设置日志收集器辅助进程选项logging_collector的值为on,其默认为off,即关闭的。在配置文件postgresql.conf中还有很多日志相关的选项,以log开头,此处不再详细一一列举,只描述日志辅助进程开启方式。

2.整体进程结构

对于后台进程和SysLogger进程关系如下:

在这里插入图片描述

3.启动流程

启动流程其实就是postmaster进程去fork出syslogger子进程,子进程执行SysLoggerMain函数,其中会循环处理等待消息,接受和写入流程。

在这里插入图片描述

4.通信协议

其中后台进程和SysLogger通信协议格式如下:

typedef struct
{
  char    nuls[2];    /* always \0\0 */
  uint16    len;      /* size of this chunk (counts data only) */
  int32    pid;      /* writer's pid */
  char is_last;    /* last chunk of message*/
  char    data[FLEXIBLE_ARRAY_MEMBER];  /* data payload starts here */
} PipeProtoHeader;

其中总是以两个\0\0开头;len用来记录当前chunk的长度;pid用于记录发送的进程id(用来做分组);is_last标识切割成多个包的日志当前是否是最好一个,syslogger接收后统一写入日志文件;data用来记录信息。
一次完成接收日志过程为:syslogger 在接收到日志消息后,将其按照 pid 进行分组,相同的 pid 说明日志消息来源于同一进程,将其组装起来,当收到包含 is_last 标记的最后一个 chunk 后,将整条日志消息打印到日志文件。

5.关键实现

5.1 日志轮转

日志轮转,通俗的说就是不想写当前日志文件了,需要找一个新的文件去写,这部分通过四个参数来判断需不需要新的文件以及其命名规则。
1)log_filename :指定日志文件的格式,假如指定的格式为test_%d_%h,那么x月1 日 1点的日志文件名就是 test_1_1.log。
2)log_rotation_age:指定超时时间,超过的话就新开一个日志文件。
3)log_rotation_size:指定限制大小,超过的话就新开一个日志文件。
4)log_truncate_on_rotation:指定是否按时间轮转后做截断。即如果下一个日志同名文件已经存在,是否直接清空该文件并从头开始写。

5.2 刷盘策略

PG 的日志在刷盘时的默认策略为:_IOLBF(行缓冲刷盘)即行满即刷盘,虽然可以保证日志尽可能不丢失,但是如果数据多的话会影响性能,linux三种刷盘方式如下,PG采用第二种:
1)_IOFBF:全缓冲模式,缓冲区写满后才刷盘
2)_IOLBF:行缓冲模式,一行写满就刷盘
3)_IONBF:不缓冲,直接刷

6.关于统一日志输出格式的思考

现在的日志系统大都要求要统一格式方便去做归档或者入库,对于老的系统,很多模块的日志格式并不统一,最简单想到的方式是去每个模块修改其日志格式;但还有一种可以借鉴PG SysLogger的思想,将不同模块的输出全部输出给一个独立的模块(进程),它内部负责解析不同格式并将其以统一格式输出,也就是统一处理和适配的思路。


http://www.kler.cn/a/444857.html

相关文章:

  • 【使用MCP协议连接本地和远程数据——以Claude的Windows客户端为例】
  • Qt同步读取串口
  • 探索Moticon智能传感器鞋垫OpenGo的功能与优势
  • 37. Three.js案例-绘制部分球体
  • OpenCV(python)从入门到精通——运算操作
  • MySQL 的事务与锁机制详解
  • 鸿蒙 NEXT 开发之后台任务开发服务框架学习笔记
  • 一款特别有趣的 Minecraft(我的世界)游戏服务器项目:Pumpkin
  • 鸿蒙项目云捐助第九讲鸿蒙App应用的捐助详情页功能实现
  • ffmpeg-SDL显示BMP
  • 鸿蒙高级特性 - 动态UI加载
  • Unity复刻胡闹厨房复盘 模块一 新输入系统订阅链与重绑定
  • 在Windows本地用网页查看编辑服务器上的 jupyter notebook
  • 【漫话机器学习系列】014.贝叶斯法则(Bayes Theorem)
  • Fabric8 Kubernetes Client 7.0.0内存泄漏深度分析与案例实践
  • Immer编写更简单的逻辑
  • SpringBoot3+Vue3开发在线考试系统
  • 说说你对 css3 display:flex 弹性盒模型 的理解
  • 阿里云 ECS 实例上升级 Docker 并使用多阶段构建
  • STM8单片机学习笔记·GPIO的片上外设寄存器
  • 轻松拿捏Spring
  • Arcgis for javascript 开发学习经验
  • 相机主要调试参数
  • LDO输入电压不满足最小压差时输出会怎样?
  • uboot, s5pv210, 内存讲解(3)
  • 【Nginx-4】Nginx负载均衡策略详解