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.mzph.cn/pingmian/64744.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法题型整理—双指针

整理双指针算法题型 两数之和 II - 输入有序数组 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] &#…

2025前端面试热门题目——计算机网络篇

计算机网络篇——面试 1. 到底什么是 TCP 连接? TCP 连接的定义 TCP(传输控制协议)是一个面向连接的传输层协议。TCP 连接是通过 三次握手 确立的可靠数据通信链路,保证了在不可靠网络(如互联网)上的数据传输的准确…

css 颗粒度

行内样式&#xff1a;样式全部写入行内。自由度最高&#xff0c;可定制化最强。但是不方便样式的复用&#xff0c;每次都要写完整的样式。 <div style"background-color: #ffffff; color: #333333;">我是一个div </div>原子化 CSS&#xff1a;每一个类名…

iOS 多个输入框弹出键盘处理

开发中遇到这样一个场景&#xff0c;有多个输入框 而不同的输入框&#xff0c;需要页面向上偏移的距离不一样 这个时候&#xff0c;需要我们在获取到键盘弹出通知的时候&#xff0c;需要 知道我们开始进行编辑的是哪一个输入框&#xff0c;这个时候 需要我们知道一个技术点&…

如何与AI对话,写好Prompt

如何与AI对话&#xff0c;写好Prompt 在与人工智能的互动中&#xff0c;Prompt的作用就如同一把开启智慧之门的钥匙。你或许不知道&#xff0c;一个简单的指令就能引导AI为你创造出想要的结果。因此&#xff0c;理解Prompt的定义与重要性是你与AI对话的第一步。 Prompt的定义…

dolphinscheduler服务RPC框架源码解析(八)RPC提供者服务整合Spring框架实现

RPC提供者服务整合Spring框架实现 1.概述2.整合设计2.1.设计分析2.2.实现类关系设计3.整合实现3.1.WorkerServer启动3.2.WorkerRpcServer启动3.3.SpringServerMethodInvokerDiscovery类3.4.扫描注册RPC提供者的ServerMethodInvoker对象3.5.谁来执行扫描注册3.6. 注册ServerMeth…

GUI07-学工具栏,懂MVC

MVC模式&#xff0c;是天底下编写GUI程序最为经典、实效的一种软件架构模式。当一个人学完菜单栏、开始学习工具栏时&#xff0c;就是他的一生中&#xff0c;最适合开始认识 MVC 模式的好时机之一。这节将安排您学习&#xff1a; Model-View-Controller 模式如何创建工具栏以及…

spring实现发送邮件功能

获取邮箱授权码 打开POP3/SMTP服务 复制授权码 pom.xml导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId…

Vue+element 回车查询页面刷新

问题描述&#xff1a; form 表单出查询条件需要实现 input 输入完成后键盘回车查询&#xff1a;keyup.enter“handleQuery”&#xff0c;如果 form 里只有一个input&#xff0c;回车没有触发事件&#xff0c;而是刷新页面&#xff0c;放两个input就没问题 问题原因&#xff1…

如何编辑调试gradle,打印日志

在build.gradle.kts中输入 println("testxwg1 ") logger.lifecycle("testxwg2") logger.log(LogLevel.ERROR,"testxwg5") 点刷新就能看到打印日志了

基于Vue 3 简单自定义Table组件(乞丐版)

本技术文档介绍了如何使用 Vue 3 和 TypeScript 构建一个高度可定制的表格组件&#xff0c;并通过插槽支持自定义列内容。本文档将详细讲解表格组件的实现原理、结构、使用方法以及样式定制。 目录 组件概述组件结构使用案例 1. 组件概述 这个 Table 组件是一个高度可定制的…

jvm栈帧中的动态链接

“-Xss”这一名称并没有一个特定的“为什么”来解释其命名&#xff0c;它更多是JVM&#xff08;Java虚拟机&#xff09;配置参数中的一个约定俗成的标识。在JVM中&#xff0c;有多个配置参数用于调整和优化Java应用程序的性能&#xff0c;这些参数通常以一个短横线“-”开头&am…

怎么将pdf中的某一个提取出来?介绍几种提取PDF中页面的方法

怎么将pdf中的某一个提取出来&#xff1f;传统上&#xff0c;我们可能通过手动截取屏幕或使用PDF阅读器的复制功能来提取信息&#xff0c;但这种方法往往不够精确&#xff0c;且无法保留原文档的排版和格式。此外&#xff0c;很多时候我们需要提取的内容可能涉及多个页面、多个…

TCP常见问题

文章目录 一、两种状态图二、常见问题1、MSL是什么 3、为何等待2MSL3、为何三次握手&#xff0c;不握手、握手一次、两次行吗4、为何四次挥手&#xff0c;三次行吗&#xff0c;两次行吗 一、两种状态图 四次挥手 二、常见问题 1、MSL是什么 MSL是Maximum Segment Lifetime的英…

UG NX二次开发(C#)-机电概念设计-UIStyler中selection块选择信号等对象的过滤器设置

文章目录 1、前言2、创建机电概念设计的模型3、创建UIStyler4、在VS2022中创建NXOPEN CSHAP的工程5、设置信号与信号适配体的过滤器6、测试选择的对象1、前言 在UG NX二次开发过程中,经常会用到UIStyler中的Selection块,即是选择对象,选择对象由于其可以选择多种类型的对象…

线程知识总结(二)

本篇文章以线程同步的相关内容为主。线程的同步机制主要用来解决线程安全问题&#xff0c;主要方式有同步代码块、同步方法等。首先来了解何为线程安全问题。 1、线程安全问题 卖票示例&#xff0c;4 个窗口卖 100 张票&#xff1a; class Ticket implements Runnable {priv…

es 开启slowlog

在 Elasticsearch 中&#xff0c;slowlog&#xff08;慢日志&#xff09;是用来记录查询和索引操作的性能数据&#xff0c;帮助你诊断性能瓶颈。你可以为查询 (search slowlog) 和索引 (index slowlog) 配置慢日志。 数据准备 POST /products/_doc/1 {"product_name&quo…

前端yarn工具打包时网络连接问题排查与解决

最近线上前端打包时提示 “There appears to be trouble with your network connection”&#xff0c;以此文档记录下排查过程。 前端打包方式 docker启动临时容器打包&#xff0c;命令如下 docker run --rm -w /app -v pwd:/app alpine-node-common:v16.20-pro sh -c "…

基础数据结构---栈

顺序表实现 一、栈类的声明 栈是一种特殊的线性表&#xff0c;可以由顺序表来实现&#xff0c;也可以由链表来实现&#xff0c;这节课&#xff0c;我们采用顺序表来实现栈。 #include <iostream>#include <stdexcept>using namespace std;template<typename …

【YOLO 项目实战】(10)YOLO8 环境配置与推理检测

欢迎关注『youcans动手学模型』系列 本专栏内容和资源同步到 GitHub/youcans 【YOLO 项目实战】&#xff08;1&#xff09;YOLO5 环境配置与检测 【YOLO 项目实战】&#xff08;10&#xff09;YOLO8 环境配置与推理检测 【YOLO5 项目实战】&#xff08;10&#xff09;YOLO8 环境…