一.背景
? 日志記錄是獲取系統(tǒng)運(yùn)行狀態(tài)的有效手段,Postgresql通過無(wú)名pipe機(jī)制和獨(dú)立日志進(jìn)程實(shí)現(xiàn)系統(tǒng)日志的統(tǒng)一管理碎浇。
二.日志進(jìn)程啟動(dòng)
1.配置參數(shù)
在文件postgresql.conf的ERROR REPORTING AND LOGGING的注釋下面找到logging_collector設(shè)置logging_collector=on打開日志進(jìn)程腾仅,同時(shí)需要重新啟動(dòng)數(shù)據(jù)庫(kù)使設(shè)置生效乒裆。
2.啟動(dòng)進(jìn)程
2.1 syslogger進(jìn)程是postmaster的子進(jìn)程
1)postmaster為父進(jìn)程。
2)syslogger_start推励,包括正常啟動(dòng)流程和syslogger異常啟動(dòng)流程缸兔。
3)pipe(syslogpipe)創(chuàng)建管道,用于接收stderr/stdout輸入吹艇。
4)mkdir 創(chuàng)建日志目錄文件惰蜜。
5)logfile_getname得到日志文件名。
6)fork_process fork子進(jìn)程(syslogger進(jìn)程)受神。
7)dup2 重定向stdout/stderr到syslogpipe管道抛猖。
8)fclose 因?yàn)閜ostmaster不會(huì)直接寫syslogFile,所以關(guān)閉日志文件鼻听。
9)返回子進(jìn)程id财著。
2.2? 子進(jìn)程流程
1)syslogger日志進(jìn)程。
2)InitPostmasterChild子進(jìn)程變量初始化撑碴。
3)closePostmasterPorts關(guān)閉fork父進(jìn)程的端口撑教。
4)斷開和postmaster共享內(nèi)存的連接。
5)業(yè)務(wù)主入口醉拓。
6)信號(hào)處理設(shè)置伟姐。
7)循環(huán)處理收苏,包括:重載日志配置文件、日志目錄愤兵、日志文件切換鹿霸、日志啟動(dòng)時(shí)間處理、日志大小控制秆乳、讀管道信息懦鼠、寫日志文件。
3.管道讀寫日志協(xié)議
1)PipeProtoHeader
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? 't' or 'f' ('T' or
* 'F' for CSV case) */
char data[FLEXIBLE_ARRAY_MEMBER]; /* data payload starts here */
} PipeProtoHeader;
當(dāng)一次寫的日志過大屹堰,可以通過 is_last標(biāo)識(shí)切割成多個(gè)包肛冶,syslogger接收后統(tǒng)一寫入日志文件。
2)elog.h寫日志函數(shù)
一般用ereport(elevel,rest)作為其他進(jìn)程寫日志的api扯键。
三.源碼位置
1.src/backend/postmaster/postmaster.c
2.src/backend/postmaster/syslogger.c
3.src/backend/utils/error/elog.c